如何使用Solr选择不同的字段值?

时间:2010-05-11 19:55:09

标签: select 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的任何可能吗?

7 个答案:

答案 0 :(得分:71)

Faceting会为您提供包含字段的不同值的结果集。

E.g。

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以获取更多信息。 Faceting是solr非常酷的一部分。享受:)

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

注意:Faceting将显示索引值,即。在应用了所有过滤器之后。解决此问题的一种方法是使用copyfield方法,以便您可以创建txt字段的facet版本。这样,您的结果将显示原始值。

希望有所帮助..关于维基上可用的分面的大量文档。或者我写了一些屏幕截图..你可以在这里查看:

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

答案 1 :(得分:21)

对于问题的DISTINCT部分,我认为您可能正在寻找Solr的field collapsing / grouping functions。它将使您能够指定希望获得唯一结果的字段,在这些唯一值上创建一个组,它将显示该组中有多少文档。

然后,您可以使用存储在单独字段中的相同substr,并对其进行折叠。

答案 2 :(得分:4)

我会将子字符串存储在不同的字段中(让我们在txt_substring中调用),然后在CraftyFella显示的txt_substring上进行分面。

通常情况下,我会使用n-gram tokenizer,但我认为你不会对此有所了解。

答案 3 :(得分: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

它还会为您提供不同值的计数。 {4.7}可能会提供stats.calcdistinct

http://wiki.apache.org/solr/StatsComponent 已过时,因为它未涵盖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}}}}

与方面的区别

如果是face,你需要知道要求所有的计数,或者你将facet.limit设置为非常高的值并自己计算结果。此外,您需要一个字符串字段,以便在此处按照您需要的方式工作。

答案 4 :(得分:1)

看一下分面搜索

答案 5 :(得分:1)

Solr 5.1及更高版本具有新的Facet模块,该模块集成了对查找字段中唯一值数量的支持。您甚至可以在一个方面的每个存储桶的字段中找到唯一值的数量,并按该值排序以查找最高或最低数量的唯一值。

&#34; myfield&#34;中的唯一值数量:     json.facet = {X:&#39;唯一的(MyField的)&#39;}

分面&#34;类别&#34;字段,并为每个类别显示&#34;颜色&#34;:

中的唯一值的数量
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及更高版本中。更多方面的功能,如&#34; unique&#34;显示在http://yonik.com/solr-facet-functions/

答案 6 :(得分:0)

使用JSON API查找“ myfield”中唯一值数量的最佳方法:

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