2011-02-03 102 views
2

我有一個不尋常的情況。通常情況下,當您搜索文本索引時,您會針對大量條款的文檔搜索少量關鍵字。如何在SOLR/lucene中匹配搜索字符串的子集

例如,您可能搜索「快速棕色」,並期望匹配「快速棕色狐狸跳過懶惰的狗」。

我有這種情況,在我的文檔存儲中有很多小短語,我希望將它們與較大的查詢短語進行匹配。

例如,如果我有一個查詢:

  • 「快速的棕色狐狸跳過懶狗」

和文件

  • 「敏捷的棕色」
  • 「狐狸過來」
  • 「懶狗」

我想找到在查詢中出現短語的文檔。在這種情況下,「快速棕色」和「懶狗」(但不是「狐狸結束」,因爲儘管令牌匹配它不是搜索字符串中的短語)。

這種查詢可能與SOLR/lucene?

回答

3

這聽起來像你想在你的分析中使用ShingleFilter,以便你索引單詞bigrams:所以在查詢和索引時添加ShingleFilterFactory。

在索引時間您的文檔,然後建立索引,例如:

  • 「敏捷的棕色」 - > quick_brown
  • 「狐狸過」 - > fox_over
  • 「懶狗」 - > lazy_dog

在查詢時查詢變爲:

  • 「快速的棕色狐狸跳過懶狗」 - >「the_quick quick_brown brown_fox fox_jumps jumps_over over_the the_lazy lazy_dog」

這仍然是不行的,默認情況下它會形成一個短語查詢。 所以在你的查詢分析器中只有在ShingleFilterFactory後面添加PositionFilterFactory。這種「變平」在查詢中的位置,使得所述的QueryParser對待輸出作爲同義詞,這將產生一個booleanquery與這些潛艇(都應該條款,從而它基本上OR查詢):

BooleanQuery:

  • the_quick或
  • quick_brown或
  • brown_fox或
  • ...

這個笑它是最高效的方式,因爲它實際上只是一個termqueries的布爾型查詢。

+0

謝謝羅伯特。我仍在消化你的答案,但似乎是合理的。它似乎假定一個固定的單一大小。如果您的文檔有3個或更多標記,可以適應嗎? – Glen 2011-02-06 23:10:02

2

聽起來像你想要的DisMax「最小匹配」參數。我在這裏寫了一篇關於這個概念的博客文章:http://blog.websolr.com/post/1299174416。還有Solr wiki on minimum match

對於查詢中的所有「可選」術語(未明確指定的術語),使用+/-(無論它們是「+強制」還是「禁止」),應用「最小匹配」概念。默認情況下,最小匹配爲100%,這意味着必須存在100%的可選條款。換句話說,您的所有條款都被視爲強制性的。

這就是爲什麼您的較長查詢目前不匹配包含該短語的較短片段的文檔。較長搜索短語中的其他關鍵字將被視爲強制。

如果您將最小匹配降至1,那麼只有您的一個可選條款將被視爲必填條件。在某些方面,這與100%的默認值相反。這就像你的查詢quick brown fox…變成quick OR brown OR fox OR …等等。

如果您將最低匹配設置爲2,那麼您的搜索短語將分解爲兩個詞組。搜索quick brown fox變成(quick brown) OR (brown fox) OR (quick fox) …等等。 (請原諒我的僞查詢,我相信你會看到這一點。)

最小匹配參數還支持百分比 - 比如說20% - 有些甚至是more complex expressions。所以有相當數量的可調整性。

1

只設置毫米參數將不能滿足您的需求,因爲

「快速的棕色狐狸跳過懶狗」

將匹配所有三個文件

  • 「敏捷的棕色」
  • 「fox over」
  • 「懶狗」

和你說:

我想找到 都發生在 查詢短語的文獻。在這種情況下,「快速棕色」和 「懶狗」(但不是「狐狸過來」,因爲 雖然令牌匹配它不是搜索字符串中的 短語)。

相關問題