web-dev-qa-db-fra.com

Requête de recherche Solr sur plusieurs champs

Est-il possible de rechercher dans Solr sur deux champs en utilisant deux mots différents et de ne récupérer que les résultats qui contiennent les deux?

Par exemple, si j'ai les champs "type" et "location", je veux seulement les résultats qui contiennent type = 'meubles' et location = 'bureau'.

41
jay

Vous pouvez utiliser des opérateurs booléens et rechercher sur des champs individuels.

q=type:furniture AND location:office

Si les valeurs sont fixes, il est préférable d'utiliser Filter Queries for Performance.

fq=type:furniture AND location:office
61
Jayendra

Les solutions suggérées ont l'inconvénient que vous devez vous soucier de l'échappement des caractères spéciaux. Si l'utilisateur recherche "type: d'or ET lieu: pause-café", la requête échouera.

Je suggère de combiner deux gestionnaires edismax:

 <requestHandler name="/combine" class="solr.SearchHandler" default="false">
     <lst name="invariants">
       <str name="q">
        (_query_:"{!edismax qf='type' v=$uq1}"
   AND _query_:"{!edismax qf='location' v=$uq2}")
       </str>
     </lst>
  </requestHandler>

Appelez le gestionnaire de requêtes comme ceci:

http://localhost:8983/solr/collection1/combine?uq1=furniture&uq2=office

Explication

  • Les variables $ uq1 et $ uq2 seront remplacées par les paramètres de requête uq1 et uq2.
  • Le résultat de la première requête edismax (uq1) est combiné par ET logique avec la deuxième requête edismax (uq2)

Solr Docs

https://wiki.Apache.org/solr/LocalParams

5
Matthias M

Vous pouvez également utiliser la fonction boostQuery sur le gestionnaire dismaxRequest comme

type=dismax&bq=type:furniture AND location:office
4
A Null Pointer
fq=type:furniture AND location:office

Au lieu d'utiliser AND, cela pourrait également être divisé en deux requêtes de filtre.

fq=type:furniture
fq=location:office
1
Sapumal Jayaratne