簡體   English   中英

帶有不完整單詞的Lucene Phrase查詢

[英]Lucene Phrase query with incomplete words

我已經使用 StandandAnalyzer 實現了 RamDirectory,並將位置數據存儲在 Lucene 緩存中,我在 Lucene 中添加了如下數據:

final Document document = new Document();

final IndexableField id = new StringField("placeId", place.getPlaceId(), Field.Store.YES);
final IndexableField name = new TextField("name", place.getName().toLowerCase(), Field.Store.YES);
final IndexableField location = new LatLonPoint("location", place.getLatitude(), place.getLongitude());
final IndexableField city = new StringField("city", place.getCity(), Field.Store.YES);

document.add(id);
document.add(name);
document.add(location);
document.add(city);

我已經實現了兩種搜索數據的方法,一種是定義半徑內的附近地點,效果很好,另一種是按名稱搜索地點。 我們還必須在按名稱搜索時實現自動完成功能。

我已經按名稱實現了搜索,如下所示:

QueryParser parser = new QueryParser("name", analyzer);
return parser.createPhraseQuery("name", searchStr, 2);

現在我有一個名字叫“湯姆診所和葯房”的地方。

如果我使用以下短語搜索,我會得到結果:

  1. 湯姆
  2. 湯姆診所
  3. 湯姆葯房

這很好,但是如果用戶輸入“Tom clini”或“Tom pharma”,Lucene 不會給我任何結果。

我嘗試在 searchStr 的末尾添加一個“*”,嘗試將短語傳遞給通配符查詢(在單個單詞上工作正常,但在多個單詞上失敗)。

此外,我想添加一些模糊性,以便可以處理拼寫錯誤,我是 Lucene 的新手,不知道從這里開始做什么,所以無論如何請幫助我!

PS 它的 Lucene 7.3

在這些情況下,最好的辦法始終是尋找好的資源。 我可以建議以下書籍

. 特別是您可能對以下一項或兩項都感興趣:

模糊查詢

Lucene 的模糊搜索實現基於 Levenshtein 距離。 它比較兩個字符串並找出將一個字符串轉換為另一個字符串所需的單個字符更改次數。 結果數字表示兩個字符串的接近程度。 在模糊搜索中,使用閾值編輯次數來確定兩個字符串是否匹配。 要在 QueryParser 中觸發模糊匹配,您可以使用波浪號 ~ 字符。 QueryParser 中有幾個配置可以調整這種類型的查詢。 這是一個代碼

queryParser.setFuzzyMinSim(2f); queryParser.setFuzzyPrefixLength(3); Query query = queryParser.parse("hump~");

此示例將返回第一、第二和第四個句子,因為模糊匹配匹配 hump 到 humpty,因為這兩個單詞被兩個字符遺漏了。 在本例中,我們將模糊查詢調整為與 2 的最小相似度。

PhraseQuery 和 MultiPhraseQuery

PhraseQuery 匹配特定的術語序列,而 MultiPhraseQuery 為您提供在同一位置匹配多個術語的選項。 例如,MultiPhrasQuery 支持諸如 humpty(dumpty OR together)之類的短語,其中它匹配位置 0 中的 humpty 和位置 1 中的 dumpty or together。

怎么做...

以下是演示兩種查詢類型的代碼片段:

 PhraseQuery query = new PhraseQuery(); query.add(new Term("content", "humpty")); query.add(new Term("content", "together")); MultiPhraseQuery query2 = new MultiPhraseQuery(); Term[] terms1 = new Term[1]; terms1[0] = new Term("content", "humpty"); Term[] terms2 = new Term[2]; terms2[0] = new Term("content", "dumpty"); terms2[1] = new Term("content", "together"); query2.add(terms1); query2.add(terms2);

它是如何工作的…

第一個查詢 PhraseQuery 一起搜索短語 humpty。 第二個查詢 MultiPhraseQuery 搜索短語 humpty(dumpty OR together)。 第一個查詢將從我們的設置中返回句子四,而第二個查詢將返回句子一、二和四。 請注意,在 MultiPhraseQuery 中,將同一位置的多個術語添加為數組。

然而,直接處理 Lucene 的應用程序並不多,使用SolrElastic Search更為常見。 兩者都在引擎蓋下使用 Lucene,但它包裝得很漂亮。 大概值得一看。

使用模糊查詢
您可以在要搜索的字段上使用模糊查詢。 請注意,您使用 TextField 是因為這些字段將被分析(而 StringField 不會)並用於全文搜索。

在這里閱讀更多FuzzyQuery


使用 SpanNear 查詢
匹配彼此接近的跨度。 可以指定 slop、中間未匹配位置的最大數量,以及是否需要按順序匹配。

在此處閱讀更多信息SpanNearQuery

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM