2010-05-11 28 views
48

我想做这个SQL的等价物,但将Solr当作我的数据存储。如何使用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的任何可能性?

回答

2

看看面搜索

66

刻面会得到你,包含字段不同值的结果集。

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> 

退房有关更多信息,维基。刻面是solr非常酷的一部分。享受:)

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

注:刻面会显示索引值,即毕竟过滤器已经被应用。解决此问题的一种方法是使用copyfield方法,以便可以创建txt字段的方面版本。这样你的结果将显示原始值。

希望有助于..维基上可用的许多关于faceting的文档。或者,我也写了一些的屏幕截图..你可以看看这里:

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

+0

我得到这个答案谷歌搜索solr截然不同。尽管需要多个字段。像不同的国家,用户。 – HMR 2015-09-10 07:44:48

+0

通过索引多字段(field1 +“。”+ field2)解决了多字段问题。现在我需要知道有多少不同的field1,field2。 有超过200万字field1.field2。以下给了我一个提示:http://yonik.com/solr-count-distinct/不知道如何做到这一点没有json,但它看起来像这样:'q = type:1&start = 0&rows = 0&json.facet = { uniquecount:“unique(field1field2_s)”}' – HMR 2015-09-11 02:45:53

4

我的子存储在不同的领域(我们在txt_substring调用),那么小就txt_substring为CraftyFella显示。

通常我会用n-gram tokenizer,但我不认为你可以在这方面进行。

19

对于您的问题的DISTINCT部分,我认为您可能正在寻找Solr的field collapsing/grouping functions。它可以让你指定一个你想得到独特结果的字段,在这些独特的值上创建一个组,并且它会告诉你该组有多少个文档。

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

+0

正是他所需要的。正是我所需要的 – encodes 2012-04-19 08:39:01

+1

我也是!谢谢你 – Oussama 2013-02-20 17:42:49

+0

根据字段类型,你可以使用(左锚)通配符。但通常情况下,使用任何索引技术的最佳解决方案是预测问题。 I.E.,如果你知道你经常要搜索SUBSTR(txt,0,3),那么你在由该子串填充的索引中创建一个字段。如果相反“txt”和子字符串长度是可变的,那么n-gram或其他处理是最好的路线。 – 2013-11-18 21:18:37

3

使用StatsComponent与参数stats.calcdistinct获得不同值的列表某一个领域:

https://cwiki.apache.org/confluence/display/solr/The+Stats+Component

它也会给你不同值的数量。(在facet的情况下,您需要知道要求所有的计数,或者将facet.limit设置为非常高的值并自己计算结果。此外,您还需要一个字符串字段,以便按照您在此处需要的方式生成facet。因为它不包括stats.calcdistinct

stats.calcdistinct是因为4.7大概可用)

http://wiki.apache.org/solr/StatsComponent 已经过时。

实施例:

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

Solr的5.1和更高具有集成查找字段中的唯一值的数目支持新的小平面模块。您甚至可以在一个方面的每个存储桶的字段中查找唯一值的数量,然后按该值进行排序以查找最高或最低数量的唯一值。 json.facet =:

在 “MyField的” 唯一值的数量{X: '唯一的(MyField的)'}

刻面由 “类别” 字段,并且对于每个类别,显示出独特的值的数量in“color”:

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/

相关问题