web-dev-qa-db-ja.com

Solrを使用して個別のフィールド値を選択する方法は?

このSQLと同等のことをしたいのですが、データストアとしてSolrを使用します。

SELECT
   DISTINCT txt
FROM
   my_table;

Solrに個別の値のみを強制する構文はどのようなものですか?

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

編集:ファセット検索は適合しているように見えますが、調査したところ、問題の半分しか詳しくないことに気付きました。

私のSQLクエリは読むべきです...

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

Solrでこの可能性はありますか?

51
dacracot

ファセットは、フィールドの個別の値を含む結果セットを取得します。

例えば。

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

次のようなものを取得する必要があります。

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

詳細については、Wikiをご覧ください。ファセットは、solrの非常にクールな部分です。楽しい :)

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

注:ファセットにはインデックス付きの値が表示されます。すべてのフィルターが適用された後。これを回避する1つの方法は、copyfieldメソッドを使用して、txtフィールドのファセットバージョンを作成できるようにすることです。これにより、結果に元の値が表示されます。

それが助けてくれることを願っています。または、スクリーンショットを使用していくつかを書きました。ここで確認できます。

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

71
CraftyFella

質問のDISTINCT部分については、Solrの フィールドの折りたたみ/グループ化関数 を探しているのではないかと思います。一意の結果が必要なフィールドを指定し、それらの一意の値でグループを作成し、そのグループのドキュメント数を表示できます。

その後、別のフィールドに保存されている同じsubstrを使用し、その上で折りたたみます。

21
Antony Stubbs

サブストリングを別のフィールドに保存し(txt_substringで呼び出しましょう)、CraftyFellaが示したようにtxt_substringのファセットを作成します。

通常、私は n-gram tokenizer を使用しますが、それについてファセットできるとは思いません。

4

特定のフィールドの個別の値のリストを取得するには、パラメーターstats.calcdistinctを使用してStatsComponentを使用します。

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

また、個別の値のカウントも提供します。 stats.calcdistinctはおそらく4.7以降で利用可能です。

http://wiki.Apache.org/solr/StatsComponentstats.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}}}}

ファセットとの違い

ファセットの場合、すべてを要求するにはカウントを知る必要があります。または、facet.limitを本当に高い値に設定して、結果を自分でカウントする必要があります。また、ファセットをここで必要な方法で機能させるには、文字列フィールドが必要です。

4
Risadinha

Solr 5.1以降には、フィールド内の一意の値の数を検索するためのサポートが統合された新しいファセットモジュールがあります。ファセットの各バケットのフィールドで一意の値の数を見つけ、その値でソートして、一意の値の最大数または最小数を見つけることもできます。

「myfield」の一意の値の数:json.facet = {x: 'unique(myfield)'}

「カテゴリ」フィールドによるファセット、および各カテゴリについて、一意の値の数を「色」で表示します。

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
    }
  }}
}

これはSolr 5.1以降にあります。 「ユニーク」などのその他のファセット関数は http://yonik.com/solr-facet-functions/ に示されています

1
Yonik

ファセット検索をご覧ください

1
Tim Mahy

JSON APIを使用して、「myfield」で一意の値の数を見つける最良の方法:

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