2012-09-03 77 views
1

几个月前我问了一个类似的问题here。但我无法正常工作:NGram按顺序搜索

我尝试建立一个简单的文件名搜索。我希望用户可以搜索 的文件名的任何部分。
比方说,以下文件名进行索引:

[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”查询并不尊重 这些术语的顺序,所以我决定使用“span_near”查询。这在大多数情况下工作正常 。

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

如在查询“‘2012’接着‘01’”,因为NGRAM标记生成器不 不起作用上面的例子中提到的生成每个 令牌的位置值,但这些值不当被“span_near”查询使用时非常有用。虽然 建立索引,但术语“2012”被分配给大于术语“01”的位置值(例如10)的位置值(50) 。由于50和10 不是为了查询将没有结果。订单物品 仅对具有相同长度的条款(例如,“12”后跟 '01'“)或条款按长度排序(例如,”20“后跟 )进行了更正。 12' “)。

那么我该如何实现正确的搜索行为呢?我只希望能力 在尊重 条款的顺序的同时搜索文件名的任何部分。
也许有办法告诉“span_near”不使用该位置,而是使用 代替“start_offset”? 还是有另一个查询,我可以使用?

回答

0

怎么样这样的通配符搜索:

“12”,其次是 “01” - > 12 * 01

+0

是的,这是因为昨天我做什么。它的工作原理是因为由于NGram-tokenizer每个可能的搜索项被索引。不过,我不知道这是否会导致性能问题。我已经通过使用edgeNGram来大幅加快搜索速度。 – Biggie

+0

有一种有限的方式可以做到这一点:例如,你只能在日期上做到这一点。用简单的英语,它将是“mysubstring以A开始并以B结尾”。我用solr来说话,所以请适当翻译。 1.复制到一个新的字段,我们称之为FieldFront 2.使用正则表达式,并只保留您感兴趣的部分(例如:[0-9 \。] +会在连续数字或点子串上匹配) 3.在左侧应用边缘n-gram 用新副本域FieldRev重复1-3。除了第3步,你会从右边做。 然后当你运行你的查询时,你可以说类似于A:12和B:01 –