Elasticsearch自动完成按长度排序

时间:2016-11-16 09:12:22

标签: elasticsearch autocomplete elasticsearch-plugin elasticsearch-2.0

我想使用elasticsearch进行自动填充。
我试过了

然而,所有这些都不符合我的期望

假设我有以下数据:

json_decode()

每当我查询PHP Programing php prado framework OOP PHP Programming PHPMyAdmin PHP Php 时,结果都会如上所示^
如何让PHP首先显示?而不是最后一个 为什么PHP编程的权重比PHP高,这等于查询?

注意:我已经添加了小写过滤器,因此将查询视为区分大小写,这就是为什么PHP都与查询匹配

2 个答案:

答案 0 :(得分:0)

我不确切知道你在做什么,所以提供更多信息会有所帮助。

但我得到以下工作,而不是一个建议示例,但它显示了如何使用分数来排序

@Test
public void es() throws Exception {
    insert("value", "foo foo");
    insert("value", "foo");
    insert("value", "fooa");
    insert("value", "fao");
    insert("value", "foo potato foo bar");
    insert("value", "foo potato bar");
    insert("value", "foo potato");
    insert("value", "foo vegetable");
    insert("value", "foo vegetable");

    Thread.sleep(1000);
    SearchResponse searchResponse =
        getClient().prepareSearch()
            .setQuery(QueryBuilders.matchPhraseQuery("value", "foo"))
            .addSort(SortBuilders.scoreSort()
                .order(SortOrder.DESC))
            .execute().actionGet();

    Arrays.stream(searchResponse.getHits().getHits())
        .forEach(h -> System.out.println(h.getSource().get("value") + ": " + h.getScore()));
}

<强>输出:

foo: 1.1177831
foo foo: 0.98798996
foo potato foo bar: 0.790392
foo potato: 0.6986144
foo vegetable: 0.6986144
foo vegetable: 0.6986144
foo potato bar: 0.55889153

答案 1 :(得分:0)

要实现所需的行为,您需要在使用edgengram分析器的字段上使用edgengrams(https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html)。要在任何其他前缀匹配的基础上对完全匹配进行排名,请维护一个未分析的附加字段,并在should子句中使用它以增加其相关性(https://www.elastic.co/guide/en/elasticsearch/guide/current/query-scoring.html