11
votes

Lucene Fuzzy Recherche sur une phrase (FuzzyQuery + spanquery)

Je cherche un moyen de coder la requête de Lucene Fuzzy qui recherche tous les documents, qui sont pertinents pour une phrase exacte. Si je cherche "Employé de Mosa appréciata", un document contient "la plupart des employés apprécie" sera renvoyé comme résultat.

J'ai essayé d'utiliser: xxx

Malheureusement, il ne fonctionne pas empiriquement. La FUZZYQUERY emploie la distance de l'éditeur, théoriquement, "L'employé de Mosa appréciata" devrait être associée à "La plupart des employés appréciez" fournir la distance appropriée est donnée. Cela semble un peu étrange.

Tous les indices? Merci.


1 commentaires

Des détails supplémentaires sont nécessaires: comment avez-vous indiqué le champ du contenu? Quel analyseur utilisez-vous? Avez-vous essayé une recherche plus étroite (commencez par la phrase exacte, puis changez un seul caractère, ...)? Combien de latitude donnez-vous dans les paramètres de requête? Qu'avez-vous exactement compris?


4 Réponses :


16
votes

Il y a deux problèmes probables ici. Premièrement: Je suppose que le champ "Contenu" est en cours d'analyse, de sorte que "la plupart des employés acheci" ne soit pas un terme, mais plutôt trois termes. Définir comme un terme unique n'est pas approprié dans ce cas.

Cependant, même si le contenu répertorié est un terme unique, un deuxième problème probable que nous avons est qu'il y a trop de distance entre les termes pour obtenir une correspondance. La distance de Damerau-Levenshtein entre Employé de Mosa Appréciata ​​Code> et La plupart des employés apprécient code> est 4 (la distance approximative, accessoirement, entre mon premier tir moyen à l'orthographe "Damerau-Levenshtein" et l'orthographe correcte). Requête floue, à partir de 4.0, les poignées modifient des distances d'au moins 2, en raison des contraintes de performance et de l'hypothèse selon laquelle les distances plus grandes ne sont généralement pas particulièrement pertinentes. P>

Si vous devez effectuer une requête de phrase avec FUZZY Termes, vous devriez examiner soit multipharasequery code> , ou combiner un ensemble de spanqueries (surtout spanmultitermquererywrapper code> et spannearquery code>) Pour répondre à vos besoins. P>

SpanQuery[] clauses = new SpanQuery[3];
clauses[0] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("contents", "mosa")));
clauses[1] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("contents", "employee")));
clauses[2] = new SpanMultiTermQueryWrapper(new FuzzyQuery(new Term("contents", "appreicata")));
SpanNearQuery query = new SpanNearQuery(clauses, 0, true)


9 commentaires

Puis-je obtenir la même chose avec la langue de la requête Lucene?


@isah - vous voulez dire avec le QueryParser standard? Non , vous ne pouvez pas. Complexhrase Parser pourrait ...


Oui, je l'ai fait avec un analyseur de requête complexe juste après vous avoir demandé, merci cependant.


@femtorgon pourriez-vous illustrer la même chose avec l'analyseur de complexperPhrase?


@Pelican_George - il suffit de passer une requête comme: "\" Mosa ~ employé ~ Appréciata ~ \ ""


@femtorgon L'analyseur de phrase complexe ne gère que la phrase et non les termes non? Dans ce cas s'il ne recevrait pas de résultats pour "Mosa ~ Appréciata ~ Mosa ~" Si la commande n'est pas importante, quelle approche conseilleriez-vous?


@Pelican_George - Non, gère des termes flous et tels que la phrase, c'est tout le point. En ce qui concerne la commande, Voir les docs . Ou prenez l'approche fournie dans ma réponse , de toute façon.


@femtorgon ah je vois. J'utilisais une version portée C # de l'analyseur extraite de Stackoverflow.com/Questtions/28094280/... Peu importe ce que je définis, je ne reçois que dans les matchs de commande.


Je suppose que l'utilisation de multipharasequery consiste-t-il à élargir une fluzyquery et à insérer chaque terme dans une position dans la multiphrasquerie? Pourrait devenir grand s'il y a beaucoup de termes correspondants.



0
votes

La réponse de Femtorgon est géniale! Merci.

Il y a une autre façon de résoudre ce problème. xxx


2 commentaires

Quelle version de Lucene avez-vous utilisé? Je ne peux pas trouver une API Fuzzytermenum pour 4.6. Dans 4.6, il n'y a que FuzzyTermsenum avec un constructeur différent


IMHO cela ne fait pas réellement ce que vous avez voulu. Peut-être pour votre simple exemple mais pas pour des documents plus complexes avec plus de texte. Parce que le FUZZYTERMENUM ne donne pas les bons termes des documents plus importants dans l'index ...



0
votes

J'en ai eu un peu (très petit) de millage avec ce qui suit:

String[] searchTerms = searchString.split(" ");
FuzzyLikeThisQuery fltw = new FuzzyLikeThisQuery(searchTerms.length, new StandardAnalyzer());
Arrays.stream(searchTerms)
    .forEach(term -> fltq.addTerms(term, FIELD, SIMILARITY_IN_EDITS, PREFIX_LENGTH); 


0 commentaires

1
votes

ComplexPhrasqueQuiseryParse Code> Poignées Fuzzy à la recherche de mots de phrase - c'est-à-dire préciser les mots qui doivent être recherchés flous et ceux qui ne devraient pas. Fonctionne comme suit

Query query = new ComplexPhraseQueryParser("content", analyzer)
                    .parse("some test~ query~ blah blah");


0 commentaires