web-dev-qa-db-fra.com

Comment sélectionner des valeurs de champ distinctes à l'aide de Solr?

Je voudrais faire l'équivalent de ce SQL mais avec Solr comme magasin de données.

SELECT
   DISTINCT txt
FROM
   my_table;

Quelle syntaxe obligerait Solr à ne me donner que des valeurs distinctes?

http://localhost:8983/solr/select?q=txt:?????&fl=txt

EDIT: La recherche à facettes semble donc convenir, mais en l'examinant, je me suis rendu compte que je n'avais détaillé que la moitié du problème.

Ma requête SQL aurait dû lire ...

SELECT
   DISTINCT SUBSTR(txt,0,3)
FROM
   my_table;

Une possibilité de cela avec Solr?

51
dacracot

Le facettage vous procurerait un ensemble de résultats contenant des valeurs distinctes pour un champ.

Par exemple.

http://localhost:8983/solr/select/?q=*%3A*&rows=0&facet=on&facet.field=txt

Vous devriez récupérer quelque chose comme ceci:

<response>
<responseHeader><status>0</status><QTime>2</QTime></responseHeader>
<result numFound="4" start="0"/>
<lst name="facet_counts">
 <lst name="facet_queries"/>
 <lst name="facet_fields">
  <lst name="txt">
        <int name="value">100</int>
        <int name="value1">80</int>
        <int name="value2">5</int>
        <int name="value3">2</int>
        <int name="value4">1</int>
  </lst>
 </lst>
</lst>
</response>

Consultez le wiki pour plus d'informations. Le facettage est une partie vraiment cool de solr. Prendre plaisir :)

http://wiki.Apache.org/solr/SimpleFacetParameters#Facet_Fields

Remarque: Le facettage affichera la valeur indexée, c'est-à-dire après que tous les filtres ont été appliqués. Une façon de contourner ce problème consiste à utiliser la méthode copyfield, afin que vous puissiez créer une version à facettes du champ txt. De cette façon, vos résultats afficheront la valeur d'origine.

J'espère que ça aide .. Beaucoup de documentation sur les facettes disponible sur le wiki. Ou j'en ai écrit quelques-unes avec des captures d'écran .. que vous pouvez consulter ici:

http://www.craftyfella.com/2010/01/faceting-and-multifaceting-syntax-in.html

71
CraftyFella

Pour la partie DISTINCT de votre question, je pense que vous cherchez peut-être les fonctions de regroupement/regroupement de champs de Solr . Il vous permettra de spécifier un champ dont vous voulez des résultats uniques, de créer un groupe sur ces valeurs uniques et il vous montrera combien de documents sont ce groupe.

Vous pouvez ensuite utiliser le même substr stocké dans un champ séparé et le réduire.

21
Antony Stubbs

Je voudrais stocker la sous-chaîne dans un autre champ (appelons txt_substring), puis facette sur txt_substring comme l'a montré CraftyFella.

Normalement, j'utiliserais le tokenizer n-gramme , mais je ne pense pas que vous puissiez y répondre.

4

Utilisez le StatsComponent avec le paramètre stats.calcdistinct pour obtenir une liste de valeurs distinctes pour un certain champ:

Solr 7 https://lucene.Apache.org/solr/guide/7_7/the-stats-component.html

Solr 6 https://cwiki.Apache.org/confluence/display/solr/The+Stats+Component

Il vous donnera également le nombre de valeurs distinctes. stats.calcdistinct est probablement disponible depuis la 4.7.

http://wiki.Apache.org/solr/StatsComponent est obsolète car il ne couvre pas stats.calcdistinct

Exemple

/select?stats=on&stats.field=region&rows=0&stats.calcdistinct=true

"stats":{
  "stats_fields":{
    "region":{
      "min":"GB",
      "max":"GB",
      "count":20276,
      "missing":0,
      "distinctValues":["GB"],
      "countDistinct":1}}}}

Différence avec les facettes

En cas de facettes, vous devez connaître le nombre de requêtes pour tout demander, ou vous définissez le facet.limit sur quelque chose de vraiment élevé et comptez le résultat vous-même. De plus, vous avez besoin d'un champ de chaîne pour que les facettes fonctionnent comme vous en avez besoin ici.

4
Risadinha

Solr 5.1 et versions ultérieures ont le nouveau module de facettes qui a un support intégré pour trouver le nombre de valeurs uniques dans un champ. Vous pouvez même trouver le nombre de valeurs uniques dans un champ pour chaque compartiment d'une facette et trier par cette valeur pour trouver le nombre le plus élevé ou le plus bas de valeurs uniques.

Nombre de valeurs uniques dans "myfield": json.facet = {x: 'unique (myfield)'}

Facette par champ "catégorie", et pour chaque catégorie, affichez le nombre de valeurs uniques en "couleur":

json.facet={
  cat_breakdown : { terms : {  // group results by unique values of "category"
    field : category,
    facet : {
      x : "unique(color)",  // for each category, find the number of unique colors
      y : "avg(price)"      // for each category, find the average price
    }
  }}
}

C'est dans Solr 5.1 et versions ultérieures. Plus de fonctions de facette comme "unique" sont affichées sur http://yonik.com/solr-facet-functions/

1
Yonik

jetez un oeil à la recherche à facettes

1
Tim Mahy

Meilleure façon de trouver le nombre de valeurs uniques dans "myfield", en utilisant le JSON API:

http://YourCollectionAddress/select?json
={query:'\*:\*',limit:0,facet:{distinctCount:'unique(myfield)'}}
0
Sharif Shahriar