Comment puis-je combiner les deux Lucene requêtes à l'aide de OU?
J'aimerais à la recherche de mon index sur les deux champs "a" et "b". Je me suis donnée des recherches comme Freud -- theories of psychology
et j'aimerais effectuer la requête suivante:
(a="Freud" AND b="theories of psychology") OR (b="Freud" AND a="theories of psychology")
Comment dois-je faire? Jusqu'à présent j'ai Lucene construction de deux moitiés (firstHalf
et secondHalf
) à l'aide de MultiFieldQueryParser
, puis je l'ai combiné avec
BooleanQuery combined = new BooleanQuery();
combined.add(firstHalf, BooleanClause.Occur.SHOULD);
combined.add(secondHalf, BooleanClause.Occur.SHOULD);
Mais combined
des résultats permet d'être renvoyé où seuls les "théories" et non pas "psychologie", où je veux absolument les deux termes. Il semble que Lucene est le fractionnement des théories de la psychologie" en trois mots et de les combiner individuellement, avec OU. Comment puis-je éviter cela?
firstHalf
ressemble:
Query firstHalf = MultiFieldQueryParser.parse(Version.LUCENE_33,
new String[]{"Freud", "theories of psychology"},
new String[]{"a", "b"},
new BooleanClause.Occur[]{BooleanClause.Occur.MUST, BooleanClause.Occur.MUST},
analyzer);
où analyzer
est juste un StandardAnalyzer
objet.
Êtes-vous sûr que la requête est correcte? La requête
theories of psychology
signifie qu'au moins l'un des trois mots doit se produire quelque part, mais aucun d'eux est un mot requis.Nope, j'ai dû le modifier pour mettre cette restriction. Je pense que je l'ai eu. 🙂
OriginalL'auteur dmn | 2011-11-23
Vous devez vous connecter pour publier un commentaire.
Compris moi-même, mais maintenant, le code est beaucoup plus long; si quelqu'un connaît une solution plus élégante, s'il vous plaît poster et je serai heureux de récompense. 🙂 (Même si je vais faire cela dans une méthode peu...mais voici la version complète de ce qui se passe...)
S'avère
SHOULD
ne fonctionner de la manière dont j'ai besoin ici. J'espère que quelqu'un trouve cela utile et je ne parle pas seulement pour moi-même en public 😉OriginalL'auteur dmn
Analyseur Standard va marquer. Ainsi la requête
theories of psychology
est équivalent àtheories OR of OR psychology
.Si vous voulez la recherche de l'expression "les théories de la psychologie" utiliser un PhraseQuery, ou d'autre que la valeur par défaut QueryParser va interpréter des devis en ce sens d'une phrase (c'est à dire changer votre code
"\"theories of psychology\""
).Et oui, il y a un sens dans lequel Lucene ne pas utiliser la logique Booléenne, mais c'est technique et pas vraiment pertinent ici.
OriginalL'auteur Xodarap
J'ai écrit ci-dessous classe pour générer enchaîné les requêtes floues, un terme doit être recherché sur plusieurs champs.
Requêtes combinées peuvent être récupérées en appelant
GetQuery()
méthode.Exemple:
OriginalL'auteur Nitesh