2010-02-09 56 views
1

我有一個關於執行涉及排列的lucene查詢的問題。Lucene查詢排列

說我有兩個字段:「名稱」和「關鍵詞」和「招財披薩餐廳」用戶搜索。我希望該搜索的某個部分與「名稱」字段的全部內容匹配,並且要匹配關鍵字字段的全部內容。它應該匹配所有提供的條款,並且應該匹配字段的全部內容。例如,它可以匹配:

1)名稱: 「喬的餐廳」 的文章: 「比薩」
2)名稱: 「喬的比薩」 的文章: 「餐廳」
3)名稱: 「比薩餐廳」 的文章: 「喬斯」
4)名稱: 「比薩」 的文章: 「喬的餐廳」
5)名稱: 「比薩喬斯」 的文章: 「餐廳」

,但它不會匹配

6)名稱: 「大喬餐廳」關鍵字:「比薩餅」 - 因爲它不是全場比賽
7)name:「joes pizza restaurant」關鍵字:「不匹配」 - 因爲至少有一個條款應該與關鍵字字段相匹配

我想過通過計算所有的排列字段和使用布爾查詢,但是隨着術語數量的增加,這不會很好地擴展。任何人都有任何線索如何有效地實現這種查詢?

回答

1

Lucene文檔推薦使用單獨的字段,它是用於跨多個字段的查詢的'name'和'keyword'字段的串聯。做這個領域的搜索。

+0

結合去這聽起來像合理的做法。 – Glen 2010-02-10 00:04:05

0

讓我們將您的查詢分爲三個部分:

  1. 無論是「名稱」字段和「關鍵字」字段中應包含查詢的一部分。
  2. 兩場比賽應該是全場比賽。
  3. 匹配的聯合應該完全覆蓋查詢。

我會實現它是這樣的:

  1. 創建原始查詢的標記組成的布爾查詢。將它作爲「必須」術語的分解。例如在這個例子中是這樣的:

    (name:joes OR name:restaurant OR name:pizza)AND(關鍵字:joes OR關鍵字:restaurant OR關鍵字:pizza) 與該查詢匹配的任何文件具有原始查詢的一部分在每個領域。 (這可能是一個ConstantScoreQuery來節省時間)。

  2. 乘載第一個查詢匹配。將字段內容提取爲令牌,並將它們存儲在字符串集中。只保留集合的集合等於從原始查詢中設置的字符串的匹配,並且集合具有空的交集。 (這處理覆蓋物 - 上面的項目3)。對於你的第一個例子,我們將擁有滿足兩個條件的集合{「joes」,「restaurant」}和{「pizza」}。

  3. 選擇左比賽的集大小,並將它們與字段長度。對於您的第一個示例,我們將設置大小爲2和1,這應分別對應於2和1的字段長度。

請注意,我的項目2和3不是常規Lucene評分的一部分,而是外部Java代碼。