Автозаполнение Elasticsearch, сортировка по длине

Я хочу использовать автозаполнение с помощью elasticsearch

Я пробовал

однако все они не соответствуют моим ожиданиям

предположим, у меня есть такие данные, как:

PHP Programing
php prado framework
OOP PHP Programming
PHPMyAdmin
PHP
Php

всякий раз, когда я запрашиваю PHP, результат будет похож на приведенный выше список ^
Как сделать так, чтобы PHP отображался первым? вместо последнего
и почему PHP Programming имеет больший вес, чем PHP, который равен запросу?

примечание: я уже добавил фильтр нижнего регистра, поэтому запрос обрабатывается как чувствительный к регистру, поэтому оба php, Php, PHP соответствуют запросу


person user2033624    schedule 16.11.2016    source источник


Ответы (2)


Я не знаю точно, чем вы занимаетесь, так что дополнительная информация поможет.

Но у меня работает следующее, а не пример предложения, но он показывает, как вы можете использовать счет для сортировки

@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
person J2B    schedule 16.11.2016

Для достижения желаемого поведения вам необходимо использовать edgengrams(https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html) в поле, использующем анализатор Edgengram. Чтобы ранжировать точные совпадения над любыми другими совпадениями префикса, сохраните дополнительное поле, которое не анализируется, и используйте его в предложении «следует» для повышения его релевантности (https://www.elastic.co/guide/en/).elasticsearch/guide/current/query-scoring.html)

person moyukh bera    schedule 16.11.2016