NGram有序搜索

时间:2012-09-03 13:54:53

标签: solr lucene elasticsearch

几个月前,我问了一个类似的问题here。但是我无法正常工作:

我尝试构建一个简单的文件名搜索。我希望用户可以搜索 对于文件名的任何部分。
假设以下文件名已编入索引:

[1] My_file_2012.01.12.txt
[2] My_file_2012.01.05.txt
[3] My_file_2012.05.01.txt
[4] My_file_2012.08.27.txt
[5] My_file_2012.12.12.txt
[6] My_file_2011.12.12.txt
[7] file_01_2012.09.09.txt

然后用户可以搜索:

"ile_20"                    (finds the first six documents)
"12.txt"                    (finds 1, 5, 6)
"12" followed by "01"       (finds 1, 2, 3 - NOT 7)
"2012" followed by "01"     (finds 1, 2, 3 - NOT 7)

(注意:是的,用户可能真的会搜索“ile_20”之类的字符串......例如 因为复制和粘贴错误)

因此我使用nGram-tokenizer来索引文件名的每个部分。这个 到目前为止工作正常。 为了支持上面提到的“后跟”搜索,我需要一个查询 尊重条款的顺序,无论它们之间有多少文本 两个术语(可以说最多100个字符)。

由于带有“slop”的“text_phrase”-query不符合排序 正确的条款,我决定使用“span_near”查询。这很好用 在大多数情况下。

在这里看到我的完整示例 - 索引包含。错误描述:click

如上例所示,查询“'2012'后跟'01'” 因为nGram tokenizer为每个生成一个位置值,所以不起作用 令牌,但这些值在“span_near”查询使用时不是很有用。而 索引,术语“2012”被分配给位置值(50),即 大于术语“01”的位置值(例如10)。自50和10 不按顺序查询将没有结果。有序的东西工作 只纠正具有相同长度的术语(例如“12”后跟 '01'“)或者如果条款按长度排序(例如”20“后跟 ” 0.12' “)。

那么我怎样才能实现正确的搜索行为?我只想要这种能力 在尊重文件的顺序的同时搜索文件名的任何部分 条款。
也许有办法告诉“span_near”不要使用这个位置 而是“start_offset”? 或者我可以使用另一个查询吗?

1 个答案:

答案 0 :(得分:0)

如下所示的通配符搜索:

“12”后跟“01” - > 12 * 01