60 votes

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 forcerait 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;

Est-ce que cela est possible avec Solr ?

81voto

CraftyFella Points 4329

Le facettage permet d'obtenir 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

Tu devrais recevoir quelque chose en retour comme ça :

<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. Profitez-en :)

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

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

J'espère que cela vous aidera De nombreux documents sur le facettage sont disponibles sur le wiki. 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

0 votes

J'ai trouvé cette réponse en cherchant "solr distinct". Mais j'ai besoin de plusieurs champs. Quelque chose comme distinct pays, utilisateur.

0 votes

J'ai résolu le problème des champs multiples en indexant un champ multiple (champ1+ ". "+champ2). Maintenant j'ai besoin de savoir combien de champs distincts field1, field2 il y a. Il y a plus de 2 millions de champs1.field2. Ce qui suit m'a donné un indice : yonik.com/solr-count-distinct Je ne suis pas sûr de savoir comment faire sans json, mais ça ressemblerait à quelque chose comme ça : q=type:1&start=0&rows=0&json.facet={uniquecount:"unique(fiel‌​d1field2_s)"}

1 votes

Comment récupérer toutes (c'est-à-dire >100) les valeurs uniques d'un champ ?

25voto

Antony Stubbs Points 4236

Pour le DISTINCT la partie de votre question, je pense que vous cherchez peut-être la méthode de Solr fonctions de regroupement et de réduction des champs . 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 appartiennent à ce groupe.

Vous pouvez alors utiliser le même substr stocké dans un champ séparé, et s'effondrer sur cela.

1 votes

Exactement ce dont il avait besoin. Et exactement ce dont j'avais besoin.

0 votes

Selon le type de champ, vous pouvez utiliser des caractères de remplacement (ancrés à gauche). Mais comme c'est souvent le cas, la meilleure solution avec toute technologie d'indexation est d'anticiper la question. Par exemple, si vous savez que vous allez couramment rechercher SUBSTR(txt,0,3), vous créez un champ dans l'index alimenté par cette sous-chaîne. Si, au contraire, le "txt" et la longueur de la sous-chaîne sont variables, le traitement n-gram ou autre est la meilleure solution.

3 votes

Le regroupement de groupes ou de champs ne peut pas être utilisé sur des champs à valeurs multiples si j'ai bien compris !

10voto

Risadinha Points 1254

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+Composant

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

http://wiki.apache.org/solr/StatsComponent est dépassée car elle 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

Dans le cas des facettes, vous devez connaître le nombre de requêtes pour toutes les demander, ou vous définissez la facet.limit à quelque chose de très élevé et comptez le résultat vous-même. De plus, vous avez besoin d'un champ string pour faire fonctionner les facettes de la manière dont vous en avez besoin ici.

4voto

Mauricio Scheffer Points 70470

Je stocke la sous-chaîne dans un champ différent (appelons-la "sous-chaîne"). txt_substring ), puis facette sur txt_substring comme l'a montré CraftyFella.

Normalement, j'utiliserais le tokenizer n-gram mais je ne pense pas que tu puisses faire face à ça.

3voto

Yonik Points 301

Solr 5.1 et les versions ultérieures disposent du nouveau module Facet, qui offre 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 case 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 "monchamp" : json.facet={x:'unique(monchamp)'}

Facette par champ "catégorie", et pour chaque catégorie, montrer le nombre de valeurs uniques dans "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
    }
  }}
}

Ceci est dans Solr 5.1 et plus. D'autres fonctions de facettes, comme "unique", sont présentées à l'adresse suivante http://yonik.com/solr-facet-functions/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X