Solr lucene查詢語句作或查詢時的注意點

2021-08-31 12:40:13 字數 2277 閱讀 6734

在使用lucene做搜尋引擎時,中文的查詢是值得注意的一點。其中有一些問題需要尤其注意:

首先推薦在lucene方面的牛人的部落格:這裡有關於查詢的一些疑惑,在此不再做介紹。另:他的其他關於lucene的文章,也強烈推薦。

在查詢方面,與的查詢,基本不會有太大問題,中文分詞工具分好詞後,所有的term都會變為phrasequery的方式,依次對查詢條件進行查詢。

如果使用者輸入的查詢條件,想到的是或的關係,或者因為需求方面的問題,希望返回更多的資料給使用者,則都需要使用或的關係。

[color=darkred][size=large]1. autogeneratephrasequeries=false[/size][/color]

由於lucene預設是使用phrasequery來檢索資料,那我們的需求就不滿足了,這裡需要做乙個簡單的修改,在schema.xml中:

其中autogeneratephrasequeries為true時,為精確查詢,即and的關係,改為false即可。此時,query的實現類變為booleanquery,多個term變為should的關係,便實現了or的需求。

下面來看一下源**:

queryparse.term(string)的部分**為

if (wildcard) else if (prefix) else if (fuzzy) catch (exception ignored)

if(fms < 0.0f || fms > 1.0f)

}q = getfuzzyquery(field, termimage,fms);

} else

注意

q = hasnewapi ? getfieldquery(field, termimage, false) : getfieldquery(field, termimage);

這一句中,hasnewapi =true(3.1版本中為靜態變數),則進入getfieldquery(field, termimage, false)中:

if (numtokens == 0)

return null;

else if (numtokens == 1) else

}

這裡可以看到,如果autogeneratephrasequeries為false,才能建立[b]booleanquery[/b]物件,否則就為[b]phrasequery[/b]。

[color=darkred][size=large]2. 禁用"?*~等一些特殊字元[/size][/color]

在term()的**中,如果使用字元"*?~則會進入下面的偽**中:

case prefixterm:

q = getprefixquery(field,

discardescapechar(term.image.substring

(0, term.image.length()-1)));

case wildterm:

term = jj_consume_token(wildterm);

wildcard=true;

case quoted:

q = getfieldquery(field, discardescapechar

(term.image.substring(1, term.image.length()-1)), s);

case fuzzy_slop:

q = getfuzzyquery(field, termimage,fms);

他們最終產生的物件,都不會是booleanquery。這樣的情況下,導致這些分支都進入不到

q = hasnewapi ? getfieldquery(field, termimage, false) : getfieldquery(field, termimage);
中,這樣一來,所有的處理都變成以and為前提的處理 :shock:

[color=darkred][size=large]3. 思考[/size][/color]

怎麼處理這樣的問題呢?目前正在探索中,暫時考慮到的方式就是在客戶端先作一次預處理,將不符合or場景的情況都處理成or的情況,然後再交給lucene去處理。當然,這個方案有個很明顯的問題,即分詞模組都要整合到客戶端,造成很大的冗餘。

有什麼好的方法嗎?歡迎提出 :)

用ajax作分頁查詢

分頁查詢是在日常生活中經常遇到的,例如部落格分頁 關鍵字分頁查詢等,ajax的分頁相對複雜些,但是給使用者的體驗卻是非常棒的,它可以實現不用重新整理頁面而進行分頁。我用的是minzu表 首先,引入 jquery檔案和bootstrap檔案,因為要用bootstrap給分頁做樣式 script src...

Python標準庫 留給自己作查詢

雖然 python語言參考 描述了python語言 的確切語法和語義,但該庫參考手冊描述了使用python分發的標準庫。它還介紹了python發行版中通常包含的一些可選元件。python的標準庫非常廣泛,提供了下面列出的長表所示的各種設施。該庫包含內建模組 用c語言編寫 提供對python程式設計師...

laravel 多條件結合scope查詢作用域優化

在很多情況下,列表資料都需要篩選,比如訂單資料列表,可能根據前台傳的訂單狀態,使用者郵箱等條件進行篩選,通常我們的 如下 orders handler order query 篩選條件if request get status if params shipment status 最重要的是這種篩選條...