几个月前我问了一个类似的问题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”? 还是有另一个查询,我可以使用?
是的,这是因为昨天我做什么。它的工作原理是因为由于NGram-tokenizer每个可能的搜索项被索引。不过,我不知道这是否会导致性能问题。我已经通过使用edgeNGram来大幅加快搜索速度。 – Biggie
有一种有限的方式可以做到这一点:例如,你只能在日期上做到这一点。用简单的英语,它将是“mysubstring以A开始并以B结尾”。我用solr来说话,所以请适当翻译。 1.复制到一个新的字段,我们称之为FieldFront 2.使用正则表达式,并只保留您感兴趣的部分(例如:[0-9 \。] +会在连续数字或点子串上匹配) 3.在左侧应用边缘n-gram 用新副本域FieldRev重复1-3。除了第3步,你会从右边做。 然后当你运行你的查询时,你可以说类似于A:12和B:01 –