如何使用 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&start=0&rows=0&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编写查询,返回特定字段的所有值的列表