我想做相当于这个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的任何可能吗?
答案 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)'}}