0

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

Я попытался
Elasticsearch автозаполнения сортировать по длине

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

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

PHP Programing 
php prado framework 
OOP PHP Programming 
PHPMyAdmin 
PHP 
Php 

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

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

ответ

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 
0

Для достижения желаемого поведения вам нужно использовать 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)