我使用nGram过滤器实现自动完成功能,一切正常。
我的问题是返回的建议似乎是任意顺序。
例如,我有一个名为" id"的字段,它们似乎是一些数字,如" 1000"," 45100231",但存储为字符串。当我输入" 10"时,我希望看到" 1000"首先是可能" 102000"等等所以我想要的理想建议顺序是:前缀中的匹配部分首先是中间,然后是后缀。例如" 1000">" 2101">" 1110&#34 ;.如果匹配的部分都在开头,只需按下一个数字排序。例如" 1000" > " 1011" >" 10200"
我一直在阅读很多关于弹性搜索排序的帖子,但没有找到真正有用的策略。有人有任何想法?谢谢!
答案 0 :(得分:0)
我看到的一种方法是在3个字段中保留自动填充令牌: 第1个字段保留前缀(使用edgeNgram) 第二个字段只保留中间字ngram部分(但我认为这需要自定义过滤器) 第3个字段仅保留后缀
因此对于值12345
,它会生成下一组令牌:
12, 123, 1234, 12345
23, 34, 234
2345, 345, 45
当你有这样的索引时,你可以使用bool过滤器匹配这3个字段,但是使用不同的提升因子,例如你增加前缀^ 10,中间^ 1和后缀^ 0.1
我相信结果必须是可以接受的。
<强>更新强>
对于只有数字的情况,我认为最好使用此http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/query-dsl-function-score-query.html中的script_score
并手动检入mvel或javascript,如果它的前缀,中间或后缀,但你应该将raw_id保存在单独的字段中。