Sur Solr 6.5.1, j'ai un champ *_txt_en
et un champ de type document string
. Sur ces domaines, je voudrais construire une requête de la forme:Requête Solr avec plusieurs négations
match tous les documents d'un certain type de document, où:
- Certaines phrases ("phrase un", "phrase deux") doit se produire dans le champ de texte à associer
- Mais si d'autres phrases ("phrase trois", "phrase quatre", "phrase five") apparaissent également dans ce champ, elles ne correspondent pas.
Ma requête en cours Solr que j'ai écrit se présente comme suit:
(documenttype:references AND (field:"phrase one" OR field:"phrase two")) AND NOT field:"phrase three" AND NOT field:"phrase four" AND NOT field:"phrase five"
Une alternative que je peux penser est:
(documenttype:references AND (field:"phrase one" OR field:"phrase two")) AND NOT (field:"phrase three" OR field:"phrase four" OR field:"phrase five")
Les requêtes ci-dessus semble fonctionner sur un jeu de données de jouets de quelques exemples. Mais j'ai appris qu'avec Solr, il y a des règles non écrites et pas des pièges évidents, en particulier avec negations dans le cadre de requêtes booléennes.
Pour une requête comme je l'ai décrit, est-ce la bonne syntaxe pour les former?
y aurait-il des raisons de transformer mon champ ET NON: "phrase trois" ... parties en quelque chose de la forme \ *: \ * ET champ NON: "phrase trois", \ * : \ * ET NOT champ: "phrase quatre" comme vous le mentionnez? – tkja
@tkja - Non, certainement pas. Le '*: *' est une clause match-all-docs. Il semble que vous commenciez avec un ensemble de documents que vous voulez faire correspondre, et en filtrant certaines choses de cet ensemble, ce qui est ce que les négations sont conçues pour faire dans lucene. L'ajout d'un tas d'allumettes gâcherait l'ensemble de documents que vous obtenez, et le rendrait beaucoup plus lent. – femtoRgon
@tkja - Votre alternative devrait également fonctionner très bien. Où vous rencontreriez des problèmes, si cela ressemblait à 'x ET (NON (y))' – femtoRgon