當前位置:首頁 » 凈水方式 » solr結果集過濾

solr結果集過濾

發布時間: 2021-02-21 00:15:41

A. solr 中是filter先執行還是query先執行

solr query和filter執行順序:
1,fq首先在cache中查找,如果命中,則返回DocSet

2,如果沒專有命中,則在索引中屬查找,返回DocSet並cache
3,1,2步的DocSet合並為一個DocSet
4,q的查詢結果也被傳遞過來,選取兩個結果集的相同Document ID
5,如果包含post filters,合並其與4的結果

B. solr做搜索的時候,用"我們"來搜有結果,用"我"搜就沒有,請教大神什麼原因,怎麼改正

首先搜索引擎有來兩個階段:創建源索引,和搜索
舉個例子:1.『我們搞基吧』被分詞為『我們,搞基,吧』被存儲到索引里
2.『我們搞基吧』被分詞為『我,們,搞基,吧』被存儲到索引里

那麼在搜索的時候,你搜『我們』的時候,只有第一種分詞的方式才會被搜到;如果你搜『我』的時候,只有第二種分詞的方式才會被搜索到;如果你搜『搞基』的時候,兩種分詞方式的結果才都會被搜索到。

所以你搜『我們』有結果,是因為你建索引的時候『我們』分詞被分成了『我們』,而不是『我』『們』,你搜『我』肯定不會有結果啊,所以搜索和簡歷索引的時候要一致,或者存儲索引的分詞結果一定要包含搜索分詞的結果,當然這是理想情況,總值,原因就是搜索和索引的分詞的方式不一致導致的

C. 如何對solr中數據進行查詢統計並得到全部查詢統計結果

條件組合查詢
SQL查詢語版句:權
SELECT log_id,start_time,end_time,prov_id,city_id,area_id,idt_id,cnt,net_type
FROM v_i_event
WHERE prov_id = 1 AND net_type = 1 AND area_id = 10304 AND time_type = 1 AND time_id >= 20130801 AND time_id <= 20130815
ORDER BY log_id LIMIT 10;

D. 如何使solr查詢結果帶score

一、 查詢參數說明
在做solr查詢的時候,solr提供了很多參數來擴展它自身的強大回功能!以下是使用頻答率最高的一些參數!
1、常用
q - 查詢字元串,這個是必須的。如果查詢所有*:* ,根據指定欄位查詢(Name:張三 AND Address:北京)
fq - (filter query)過慮查詢,作用:在q查詢符合結果中同時是fq查詢符合的,例如:q=Name:張三&fq=CreateDate:[20081001 TO 20091031],找關鍵字mm,並且CreateDate是20081001
fl - 指定返回那些欄位內容,用逗號或空格分隔多個。

E. 使用solr查詢,庫中存在,但是查詢結果沒有

看一下給的條件全形半形大小寫有沒有差錯

F. solr 一次查詢怎麼獲取伺服器裡面有多少個這樣的結果,只想得到數量

solr查詢反回結果中帶有命中數量這一屬性,可以通過admin頁面查看詳細的返回內容。

G. solr中先檢索fieldname,然後再在結果中檢索關鍵字

去查詢filedname? filedname都是定義好的。 沒明白你的問題。
你可以直接寫AND,比如 filename1:亞洲 AND filename2:XX

H. solr不能過濾負數嗎,為什麼12345都可以,但是fq=id:-1就報錯呢

Esoir不能過濾負數嗎為什麼12345都可以但是fg=ID冒號減一就報錯呢這是演算法算錯了

I. 如何對solr中數據進行查詢統計並得到全部查

條件組合查詢
SQL查詢語句:
SELECT log_id,start_time,end_time,prov_id,city_id,area_id,idt_id,cnt,net_type
FROM v_i_event
WHERE prov_id = 1 AND net_type = 1 AND area_id = 10304 AND time_type = 1 AND time_id >= 20130801 AND time_id <= 20130815
ORDER BY log_id LIMIT 10;

J. 集群 solr 搜索 怎麼收集結果

Facet 是 solr 的高級搜索功能之一 , 可以給用戶提供更友好的搜索體驗 . 在搜索關鍵字的同時 ,能夠按照 Facet 的欄位進行分組並統計 .

二. Facet 欄位
1. 適宜被Facet 的欄位
一般代表了實體的某種公共屬性 , 如商品的分類 , 商品的製造廠家 , 書籍的出版商等等 .
2. Facet 欄位的要求
Facet 的欄位必須被索引 . 一般來說該欄位無需分詞 , 無需存儲 .
無需分詞是因為該欄位的值代表了一個整體概念 , 如電腦的品牌 」 聯想 」 代表了一個整體概念 , 如果拆成 」 聯 」,」 想 」 兩個字都不具有實際意義 . 另外該欄位的值無需進行大小寫轉換等處理 , 保持其原貌即可 .
無需存儲是因為一般而言用戶所關心的並不是該欄位的具體值 , 而是作為對查詢結果進行分組的一種手段 , 用戶一般會沿著這個分組進一步深入搜索 .
3. 特殊情況
對於一般查詢而言 , 分詞和存儲都是必要的 . 比如 CPU 類型 」Intel 酷睿 2 雙核 P7570」,拆分成 」Intel」,」 酷睿 」,」P7570」 這樣一些關鍵字並分別索引 , 可能提供更好的搜索體驗 . 但是如果將 CPU 作為 Facet 欄位 , 最好不進行分詞 . 這樣就造成了矛盾 , 解決方法為 ,將 CPU 欄位設置為不分詞不存儲 , 然後建立另外一個欄位為它的 COPY, 對這個 COPY 的欄位進行分詞和存儲 .
schema.xml

<types>
<fieldType name="string" class="solr.StrField" omitNorms="true"/>
<fieldType name="tokened" class="solr.TextField" >
<analyzer>
……
</analyzer>
</fieldType>
……
</types>
<fields>
<field name=」cpu」 type=」string」 indexed=」true」 stored=」false」/>
<field name=」cpuCopy」 type=」 tokened」 indexed=」true」 stored=」true」/>
……
</fields>
<Field source="cpu" dest="cpuCopy"/>

三. Facet 組件
Solr 的默認 requestHandler(org.apache.solr.handler.component.SearchHandler) 已經包含了 Facet 組件 (org.apache.solr.handler.component.FacetComponent). 如果自定義 requestHandler 或者對默認的 requestHandler 自定義組件列表 , 那麼需要將 Facet 加入到組件列表中去 .
solrconfig.xml

<requestHandler name="standard" class="solr.SearchHandler" default="true">
……
<arr name="components">
<str>自定義組件名</str>
<str>facet</str>
……
</arr>
</requestHandler>

四. Facet 查詢
進行 Facet 查詢需要在請求參數中加入 」facet=on」 或者 」facet=true」 只有這樣 Facet 組件才起作用 .
1. Field Facet
Facet 欄位通過在請求中加入 」facet.field」 參數加以聲明 , 如果需要對多個欄位進行 Facet查詢 , 那麼將該參數聲明多次 . 比如

/select?q=聯想
&facet=on
&facet.field=cpu
&facet.field=videoCard

返回結果 :

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name="cpu">
<int name="Intel 酷睿2雙核 T6600">48</int>
<int name="Intel 奔騰雙核 T4300">28</int>
<int name="Intel 酷睿2雙核 P8700">18</int>
<int name="Intel 酷睿2雙核 T6570">11</int>
<int name="Intel 酷睿2雙核 T6670">11</int>
<int name="Intel 奔騰雙核 T4400">9</int>
<int name="Intel 酷睿2雙核 P7450">9</int>
<int name="Intel 酷睿2雙核 T5870">8</int>
<int name="Intel 賽揚雙核 T3000">7</int>
<int name="Intel 奔騰雙核 SU4100">6</int>
<int name="Intel 酷睿2雙核 P8400">6</int>
<int name="Intel 酷睿2雙核 SU7300">5</int>
<int name="Intel 酷睿 i3 330M">4</int>
</lst>
<lst name="videoCard">
<int name="ATI Mobility Radeon HD 4">63</int>
<int name="NVIDIA GeForce G 105M">24</int>
<int name="NVIDIA GeForce GT 240M">21</int>
<int name="NVIDIA GeForce G 103M">8</int>
<int name="NVIDIA GeForce GT 220M">8</int>
<int name="NVIDIA GeForce 9400M G">7</int>
<int name="NVIDIA GeForce G 210M">6</int>
</lst>
</lst>
<lst name="facet_dates"/>
</lst>

各個 Facet 欄位互不影響 , 且可以針對每個 Facet 欄位設置查詢參數 . 以下介紹的參數既可以應用於所有的 Facet 欄位 , 也可以應用於每個單獨的 Facet 欄位 . 應用於單獨的欄位時通過

f.欄位名.參數名=參數值

這種方式調用 . 比如 facet.prefix 參數應用於 cpu 欄位 , 可以採用如下形式

f.cpu.facet.prefix=Intel

1.1 facet.prefix
表示 Facet 欄位值的前綴 . 比如 」facet.field=cpu&facet.prefix=Intel」, 那麼對 cpu欄位進行 Facet 查詢 , 返回的 cpu 都是以 」Intel」 開頭的 ,」AMD」 開頭的 cpu 型號將不會被統計在內 .
1.2 facet.sort
表示 Facet 欄位值以哪種順序返回 . 可接受的值為 true(count)|false(index,lex). true(count) 表示按照 count 值從大到小排列 . false(index,lex) 表示按照欄位值的自然順序( 字母 , 數字的順序 ) 排列 . 默認情況下為 true(count). 當 facet.limit 值為負數時 ,默認 facet.sort= false(index,lex).
1.3 facet.limit
限制 Facet 欄位返回的結果條數 . 默認值為 100. 如果此值為負數 , 表示不限制 .
1.4 facet.offset
返回結果集的偏移量 , 默認為 0. 它與 facet.limit 配合使用可以達到分頁的效果 .
1.5 facet.mincount
限制了 Facet 欄位值的最小 count, 默認為 0. 合理設置該參數可以將用戶的關注點集中在少數比較熱門的領域 .
1.6 facet.missing
默認為 」」, 如果設置為 true 或者 on, 那麼將統計那些該 Facet 欄位值為 null 的記錄.
1.7 facet.method
取值為 enum 或 fc, 默認為 fc. 該欄位表示了兩種 Facet 的演算法 , 與執行效率相關 .
enum 適用於欄位值比較少的情況 , 比如欄位類型為布爾型 , 或者欄位表示中國的所有省份.Solr 會遍歷該欄位的所有取值 , 並從 filterCache 里為每個值分配一個 filter( 這里要求 solrconfig.xml 里對 filterCache 的設置足夠大 ). 然後計算每個 filter 與主查詢的交集 .
fc( 表示 Field Cache) 適用於欄位取值比較多 , 但在每個文檔里出現次數比較少的情況 .Solr 會遍歷所有的文檔 , 在每個文檔內搜索 Cache 內的值 , 如果找到就將 Cache 內該值的count 加 1.
1.8 facet.enum.cache.minDf
當 facet.method=enum 時 , 此參數其作用 ,minDf 表示 minimum document frequency. 也就是文檔內出現某個關鍵字的最少次數 . 該參數默認值為 0. 設置該參數可以減少 filterCache 的內存消耗 , 但會增加總的查詢時間 ( 計算交集的時間增加了 ). 如果設置該值的話 ,官方文檔建議優先嘗試 25-50 內的值 .
2. Date Facet
日期類型的欄位在文檔中很常見 , 如商品上市時間 , 貨物出倉時間 , 書籍上架時間等等 . 某些情況下需要針對這些欄位進行 Facet. 不過時間欄位的取值有無限性 , 用戶往往關心的不是某個時間點而是某個時間段內的查詢統計結果 . Solr 為日期欄位提供了更為方便的查詢統計方式 .當然 , 欄位的類型必須是 DateField( 或其子類型 ).
需要注意的是 , 使用 Date Facet 時 , 欄位名 , 起始時間 , 結束時間 , 時間間隔這 4 個參數都必須提供 .
與 Field Facet 類似 ,Date Facet 也可以對多個欄位進行 Facet. 並且針對每個欄位都可以單獨設置參數 .
2.1 facet.date
該參數表示需要進行 Date Facet 的欄位名 , 與 facet.field 一樣 , 該參數可以被設置多次 , 表示對多個欄位進行 Date Facet.
2.2 facet.date.start
起始時間 , 時間的一般格式為 」 1995-12-31T23:59:59Z」, 另外可以使用 」NOW」,」YEAR」,」MONTH」 等等 , 具體格式可以參考 org.apache.solr.schema. DateField 的 java doc.
2.3 facet.date.end
結束時間 .
2.4 facet.date.gap
時間間隔 . 如果 start 為 2009-1-1,end 為 2010-1-1.gap 設置為 」+1MONTH」 表示間隔1 個月 , 那麼將會把這段時間劃分為 12 個間隔段 . 注意 」+」 因為是特殊字元所以應該用 」%2B」 代替 .
2.5 facet.date.hardend
取值可以為 true|false, 默認為 false. 它表示 gap 迭代到 end 處採用何種處理 . 舉例說明 start 為 2009-1-1,end 為 2009-12-25,gap 為 」+1MONTH」,hardend 為 false 的話最後一個時間段為 2009-12-1 至 2010-1-1;hardend 為 true 的話最後一個時間段為 2009-12-1 至 2009-12-25.
2.6 facet.date.other
取值范圍為 before|after|between|none|all, 默認為 none.
before 會對 start 之前的值做統計 .
after 會對 end 之後的值做統計 .
between 會對 start 至 end 之間所有值做統計 . 如果 hardend 為 true 的話 , 那麼該值就是各個時間段統計值的和 .
none 表示該項禁用 .
all 表示 before,after,all 都會統計 .
舉例 :

&facet=on
&facet.date=date
&facet.date.start=2009-1-1T0:0:0Z
&facet.date.end=2010-1-1T0:0:0Z
&facet.date.gap=%2B1MONTH
&facet.date.other=all

返回結果 :

3. Facet Query
Facet Query 利用類似於 filter query 的語法提供了更為靈活的 Facet. 通過 facet.query 參數 , 可以對任意欄位進行篩選 .
例 1:

&facet=on
&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
&facet.query=date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]

返回結果 :

<lst name="facet_counts">
<lst name="facet_queries">
<int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>
<int name="date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]">3</int>
</lst>
<lst name="facet_fields"/>
<lst name="facet_dates"/></lst>

例 2:返回結果 :

例 3:

&facet=on
&facet.query=cpu:[A TO G]

返回結果 :

<lst name="facet_counts">
<lst name="facet_queries">
<int name="cpu:[A TO G]">11</int>
</lst>
<lst name="facet_fields"/>
<lst name="facet_dates"/>
</lst>

4. key 操作符
可以用 key 操作符為 Facet 欄位取一個別名 .
例 :

&facet=on
&facet.field={!key=中央處理器}cpu
&facet.field={!key=顯卡}videoCard

返回結果 :

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name="中央處理器">
<int name="Intel 酷睿2雙核 T6600">48</int>
<int name="Intel 奔騰雙核 T4300">28</int>
<int name="Intel 酷睿2雙核 P8700">18</int>
<int name="Intel 酷睿2雙核 T6570">11</int>
<int name="Intel 酷睿2雙核 T6670">11</int>
<int name="Intel 奔騰雙核 T4400">9</int>
<int name="Intel 酷睿2雙核 P7450">9</int>
<int name="Intel 酷睿2雙核 T5870">8</int>
<int name="Intel 賽揚雙核 T3000">7</int>
<int name="Intel 奔騰雙核 SU4100">6</int>
<int name="Intel 酷睿2雙核 P8400">6</int>
<int name="Intel 酷睿2雙核 SU7300">5</int>
<int name="Intel 酷睿 i3 330M">4</int>
</lst>
<lst name="顯卡">
<int name="ATI Mobility Radeon HD 4">63</int>
<int name="NVIDIA GeForce G 105M">24</int>
<int name="NVIDIA GeForce GT 240M">21</int>
<int name="NVIDIA GeForce G 103M">8</int>
<int name="NVIDIA GeForce GT 220M">8</int>
<int name="NVIDIA GeForce 9400M G">7</int>
<int name="NVIDIA GeForce G 210M">6</int>
</lst>
</lst>
<lst name="facet_dates"/>
</lst>

5. tag 操作符和 ex 操作符
當查詢使用 filter query 的時候 , 如果 filter query 的欄位正好是 Facet 欄位 , 那麼查詢結果往往被限制在某一個值內 .
例 :

&fq=screenSize:14
&facet=on
&facet.field=screenSize

返回結果 :

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name=" screenSize">
<int name="14.0">107</int>
<int name="10.2">0</int>
<int name="11.1">0</int>
<int name="11.6">0</int>
<int name="12.1">0</int>
<int name="13.1">0</int>
<int name="13.3">0</int>
<int name="14.1">0</int>
<int name="15.4">0</int>
<int name="15.5">0</int>
<int name="15.6">0</int>
<int name="16.0">0</int>
<int name="17.0">0</int>
<int name="17.3">0</int>
</lst>
</lst>
<lst name="facet_dates"/>
</lst>

可以看到 , 屏幕尺寸 (screenSize) 為 14 寸的產品共有 107 件 , 其它尺寸的產品的數目都是0, 這是因為在 filter 里已經限制了 screenSize:14. 這樣 , 查詢結果中 , 除了 screenSize=14 的這一項之外 , 其它項目沒有實際的意義 .
有些時候 , 用戶希望把結果限制在某一范圍內 , 又希望查看該范圍外的概況 . 比如上述情況 ,既要把查詢結果限制在 14 寸屏的筆記本 , 又想查看一下其它屏幕尺寸的筆記本有多少產品 . 這個時候需要用到 tag 和 ex 操作符 .
tag 就是把一個 filter 標記起來 ,ex(exclude) 是在 Facet 的時候把標記過的 filter 排除在外 .
例 :

&fq={!tag=aa}screenSize:14
&facet=on
&facet.field={!ex=aa}screenSize

返回結果 :

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name=" screenSize">
<int name="14.0">107</int>
<int name="14.1">40</int>
<int name="13.3">34</int>
<int name="15.6">22</int>
<int name="15.4">8</int>
<int name="11.6">6</int>
<int name="12.1">5</int>
<int name="16.0">5</int>
<int name="15.5">3</int>
<int name="17.0">3</int>
<int name="17.3">3</int>
<int name="10.2">1</int>
<int name="11.1">1</int>
<int name="13.1">1</int>
</lst>
</lst>
<lst name="facet_dates"/>
</lst>

這樣其它屏幕尺寸的統計信息就有意義了 .
五. SolrJ 對 Facet 的支持

SolrServer server = getSolrServer();//獲取SolrServer
SolrQuery query = new SolrQuery();//建立一個新的查詢
query.setQuery("*:*");
query.setFacet(true);//設置facet=on
query.addFacetField(new String[] { "cpu", "videoCard" });//設置需要facet的欄位
query.setFacetLimit(10);//限制facet返回的數量
QueryResponse response = server.query(query);
List<FacetField> facets = response.getFacetFields();//返回的facet列表
for (FacetField facet : facets) {
System.out.println(facet.getName());
System.out.println("----------------");
List<Count> counts = facet.getValues();
for (Count count : counts) {
System.out.println(count.getName() + ":" + count.getCount());
}
System.out.println();
}

熱點內容
丁度巴拉斯情人電影推薦 發布:2024-08-19 09:13:07 瀏覽:886
類似深水的露點電影 發布:2024-08-19 09:10:12 瀏覽:80
《消失的眼角膜》2電影 發布:2024-08-19 08:34:43 瀏覽:878
私人影院什麼電影好看 發布:2024-08-19 08:33:32 瀏覽:593
干 B 發布:2024-08-19 08:30:21 瀏覽:910
夜晚看片網站 發布:2024-08-19 08:20:59 瀏覽:440
台灣男同電影《越界》 發布:2024-08-19 08:04:35 瀏覽:290
看電影選座位追女孩 發布:2024-08-19 07:54:42 瀏覽:975
日本a級愛情 發布:2024-08-19 07:30:38 瀏覽:832
生活中的瑪麗類似電影 發布:2024-08-19 07:26:46 瀏覽:239