2010-05-11 29 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/

相關問題