Elasticsearch使用nGram自动完成,结果顺序

时间:2014-06-06 06:12:23

标签: elasticsearch

我使用nGram过滤器实现自动完成功能,一切正常。

我的问题是返回的建议似乎是任意顺序。

例如,我有一个名为" id"的字段,它们似乎是一些数字,如" 1000"," 45100231",但存储为字符串。当我输入" 10"时,我希望看到" 1000"首先是可能" 102000"等等所以我想要的理想建议顺序是:前缀中的匹配部分首先是中间,然后是后缀。例如" 1000">" 2101">" 1110&#34 ;.如果匹配的部分都在开头,只需按下一个数字排序。例如" 1000" > " 1011" >" 10200"

我一直在阅读很多关于弹性搜索排序的帖子,但没有找到真正有用的策略。有人有任何想法?谢谢!

1 个答案:

答案 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保存在单独的字段中。