1

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ù:

  1. Certaines phrases ("phrase un", "phrase deux") doit se produire dans le champ de texte à associer
  2. 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?

Répondre

1

Votre requête me va bien.

A NOT dans Lucene/Solr est utilisé pour filtrer les résultats et ne pas tout le reste correspondant implique, comme dans une base de données (bien, parfois il le fait dans SOLR). Un moyen facile de penser à la façon dont les négations fonctionnent dans Lucene, est de supposer qu'il y a toujours un AND en face d'eux.

  • term1 OR NOT term2 va réellement obtenir les résultats de term1 AND NOT term2
  • NOT term1 ne fonctionnera pas dans Lucene, parce que AND NOT term1 n'a pas de sens. (Solr fera que le travail qu'elle transformant automatiquement en *:* AND NOT term1, donc pourquoi le traitement de solr de NOT est un peu incohérent)
  • term1 AND (NOT term2) ne fonctionnera pas, car il va évaluer AND NOT term2 avant de passer aux pièces entre parenthèses extérieures (Je ne t pensent solr corrige celui-ci, mais ne pas me citer)

pour un peu plus d'explications sur la raison pour laquelle il diffère de type DB logique booléenne, jetez un oeil à my answer here

+0

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

+1

@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

+1

@tkja - Votre alternative devrait également fonctionner très bien. Où vous rencontreriez des problèmes, si cela ressemblait à 'x ET (NON (y))' – femtoRgon