Lucene requête: bla~* (associer des mots qui commencent par quelque chose de flou), comment?
Dans la Lucene la syntaxe de la requête, je tiens à combiner * et ~ dans une requête valide de similaire à:
bla~* //requête non valide
Sens: faites correspondre des mots qui commencent par "bla" ou quelque chose de semblable à "bla".
Mise à jour:
Ce que je fais maintenant, les travaux pour une petite entrée, utilisez la commande suivante (extrait de SOLR schéma):
<fieldtype name="text_ngrams" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
Dans le cas où vous n'utilisez pas de SOLR, le résultat est le suivant.
Indextime: données de l'Indice par la création d'un champ contenant tous les préfixes de mon (court) entrée.
Searchtime: utilisez uniquement le ~ de l'opérateur, en tant que préfixes sont explicitement présents dans l'index.
OriginalL'auteur Pimin Konstantin Kefaloukos | 2010-04-13
Vous devez vous connecter pour publier un commentaire.
Je ne crois pas Lucene prend en charge quelque chose comme cela, je ne crois pas qu'il a une solution triviale.
"Floue" les recherches ne fonctionnent pas sur un nombre fixe de caractères.
bla~
peut par exemple correspondre àblah
et elle doit donc considérer l'ensemble du terme.Ce que vous pourriez faire est de mettre en œuvre une requête d'extension de l'algorithme qui a pris la requête
bla~*
et la convertit en une série de la OU des requêtesMais c'est vraiment viable que si la chaîne est de très courte durée, ou si vous pouvez limiter l'expansion fondé sur des règles.
Sinon, si la longueur du préfixe est fixe, vous pouvez ajouter un champ avec le sous-chaînes et d'effectuer la recherche floue sur ce point. Que serait vous donner ce que vous voulez, mais ne fonctionnera que si votre cas est suffisamment étroit.
Vous ne spécifiez pas exactement pourquoi vous avez besoin de cela, peut-être que cela permettra de susciter d'autres solutions.
Un scénario que je peux penser à est de traiter avec les différentes forme de mots. E. g. trouver
car
etcars
.C'est facile en anglais, il y a le mot conjugaison disponibles. Dans d'autres langues, il peut être assez difficile de mettre en œuvre word conjugaison, si ce n'est impossible.
Dans ce scénario, vous pouvez cependant (en supposant que vous avez accès à un bon dictionnaire) pour le terme de recherche et d'étendre la recherche par programme de recherche pour toutes les formes de la parole.
E. g. une recherche de
cars
est traduit encar OR cars
. Cela a été appliquée avec succès pour ma langue dans au moins un moteur de recherche, mais il est évidemment non-trivial à mettre en œuvre.bien sûr, si je pouvais dire lucene seulement sur les x premiers caractères de chaque mot dans l'index, à l'aide de ~ fonctionnerait...
Vous devez aller au-delà de Lucene ici, l'utilisation d'une chaîne de l'algorithme de comparaison comme Levenstein, Jaro-Winkler etc. (qv. ci-dessous)
OriginalL'auteur Kris
dans le développement de tronc de lucene (pas encore sortie), il est le code pour soutenir l'utilisation de tels cas, via AutomatonQuery. Attention: l'Api peut/va changer avant sa sorti, mais ça vous donne l'idée.
Voici un exemple pour ton cas:
Votre solution est tout simplement parfait pour les petites entrées... mais comme vous avez fait allusion, ne sera pas un problème pour les grandes entrées: vous allez ajouter une énorme quantité de termes et d'affichage pour toutes ces préfixes... ce sera de faire le pré-Lucene 4.0 floue requête même plus lent qu'une analyse linéaire de tous les termes.
Est-il un Lucene la syntaxe de la requête qui vous donne accès à l'Automate de requête par le biais de Solr sans codage?
OriginalL'auteur Robert Muir
C'est pour une recherche par adresse de service, où je veux suggérer des adresses en fonction partiellement saisi et, éventuellement, fait une faute de frappe des noms de rues/citynames/etc (toute combinaison). (pensez à ajax, les utilisateurs de taper partielle de la rue des adresses dans un champ de texte)
Pour ce cas, la suggestion de requête d'extension est peut-être pas si faisable, comme la chaîne partielle (adresse) peut être plus longue que "court" 🙂
Normalisation
Une possibilité à laquelle je pense est d'utiliser la chaîne de "normalisation", au lieu de procéder à des recherches floues, et il suffit de les combiner avec des caractères génériques des requêtes. Une adresse de rue de
"miklabraut 42, 101 reykjavík"
, deviendrait"miklabrat 42 101 rekavik"
lorsque normalisée.Ainsi, la construction de l'indice, comme ce:
1) la construction de l'index avec les enregistrements contenant "normalisé" versions de noms de rue, noms de villes, etc, avec une adresse de rue par le document (1 ou plusieurs champs).
Et une recherche dans l'index comme ce:
2) Normaliser inputstrings (par exemple
mikl reyk
) utilisés pour former les requêtes (c'est à diremik rek
).3) utiliser le caractère générique de l'op pour effectuer la recherche (c'est à dire
mik* AND rek*
), laissant le flou de la partie.Qui vole, à condition que la normalisation de l'algorithme est assez bon 🙂
OriginalL'auteur Pimin Konstantin Kefaloukos
Vous voulez dire que vous souhaitez les combiner un caractère générique et floue de la requête? Vous pouvez utiliser une requête booléenne avec une condition OU à combiner, par exemple:
et oui, ce n'est pas ce que je veux 🙂
Ok, merci pour la clarification, une approche que j'ai utilisé (pour la correspondance des noms de protéines, etc.) l'aide de la chaîne distances comme Smith-Waterman, Jaro-Winkler etc. Un outil comme SimMetrics peut-être d'un peu d'aide dcs.shef.ac.royaume-uni/~sam/simmetrics.html
C'est la deuxième fois que j'entends parler de SimMetrics, peut-être il est temps de lui donner un spin 🙂 merci à vous
OriginalL'auteur Mikos