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?
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
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.
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.
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
/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}}}}
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.
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/
jetez un oeil à la recherche à facettes
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)'}}