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

Posted

技术标签:

【中文标题】如何使用 Solr 选择不同的字段值?【英文标题】:How to select distinct field values using Solr? 【发布时间】:2011-02-18 07:56:48 【问题描述】:

我想做与此 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 有这种可能性吗?

【问题讨论】:

【参考方案1】:

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

例如

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

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

希望对您有所帮助.. wiki 上提供了很多关于 faceting 的文档。或者我确实写了一些屏幕截图..你可以在这里查看:

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

【讨论】:

我在谷歌上搜索 solr distinct 得到了这个答案。虽然需要多个字段。像不同的国家,用户。 通过索引多字段(field1+"."+field2)解决了多字段。现在我需要知道有多少不同的 field1, field2。有超过 200 万个 field1.field2。以下给了我一个提示:yonik.com/solr-count-distinct不知道如何在没有 json 的情况下执行此操作,但它看起来像:q=type:1&amp;start=0&amp;rows=0&amp;json.facet=uniquecount:"unique(field1field2_s)" 如何检索一个字段中的所有(即>100)唯一值? 如果我们在一个已标记化的字段上分面,这将不起作用。【参考方案2】:

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

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

【讨论】:

正是他所需要的。正是我需要的 根据字段类型,您可能可以使用(左锚定)通配符。但通常情况下,任何索引技术的最佳解决方案都是预测问题。即,如果您知道您通常会搜索 SUBSTR(txt,0,3),那么您在由该子字符串填充的索引中创建一个字段。如果相反,“txt”和子字符串长度是可变的,那么 n-gram 或其他处理是最好的路线。 据我所知,组或字段折叠不能用于多值字段!【参考方案3】:

使用带有参数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/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

方面的区别

对于构面,您需要知道请求全部的计数,或者您将 facet.limit 设置为非常高的值并自己计算结果。此外,您需要一个字符串字段来使构面按照您需要的方式工作。

【讨论】:

【参考方案4】:

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

通常我会使用n-gram tokenizer,但我认为您无法解决这个问题。

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

这适用于计算有多少不同的字段值,但它不会返回它们

以上是关于如何使用 Solr 选择不同的字段值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用spring-data-solr编写查询,返回特定字段的所有值的列表

如何编写一个 solr 查询来检索数字字段值小于指定值的所有记录?

如何在 solr 6+ 中使用托管模式编辑字段类型

将 Solr 重复值删除到多值字段中

如何使用 sunspot solr 索引文本(大数据)字段

如何使用SOLRJ java客户端从SOLR获取列名(字段)?