Как сделать заказ на поле, исходя из того, как далеко он находится в Elasticsearch? - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь использовать API-интерфейс Elasticsearch Java для поиска документов с полем, содержащим поисковый термин, а затем упорядочиваю результаты в зависимости от того, как далеко слева находится термин в значении полей.

ЭтоВот как я создаю индекс:

final CreateIndexRequest request = new CreateIndexRequest("index-name");
request.settings(Settings.builder().put("index.max_result_window", MAX_RESULTS));
client.admin().indices().create(request).actionGet();

Вот как я создаю отображение:

{
  "part": {
    "properties":{
      "PartNumber":{
        "type":"keyword"
      }
    }
  }
}

Вот как я запрашиваю Elasticsearch:

final CreateIndexRequest request = new CreateIndexRequest("index-name");
request.settings(Settings.builder().put("index.max_result_window", MAX_RESULTS));
client.admin().indices().create(request).actionGet();
client.admin()
      .indices()
      .preparePutMapping("index-name")
      .setType("part")
      .setSource(source, XContentType.JSON).execute().actionGet();

final SearchResponse searchResponse = elasticClient.getClient()
                .prepareSearch("index-name")
                .setQuery(boolQuery().must(wildcardQuery("PartNumber", "*five*")))
                .addSort("PartNumber", SortOrder.DESC)
                .setTypes("part")
                .get();

, который возвращает результаты в следующем порядке:

three five six four five four 11
five 11 three 2 three five four threefive
11 22 three fourfive five four
1 22 three four six five

Однако порядок, в котором я хотел бы, чтобы они находились в следующем порядке:

five 11 three 2 three five four threefive
three five six four five four 11
11 22 three fourfive five four
1 22 three four six five

Где он упорядочивает их в зависимости от того, как далекоСлева от значения встречается термин five, возможно ли это?

1 Ответ

0 голосов
/ 29 июня 2019

Во-первых, старайтесь не использовать подстановочный знак запрос. Они неэффективны, особенно если вы используете keyword поля с длинным текстом.

Если вы используете запросы с подстановочными знаками для совпадения five в тексте fourfive, вам следует использовать токенайзер ngram .

При этом положение токенов не учитывается при подсчете очков. Я не знаю простого способа заказа документов с учетом положения токенов.

Одним из решений может быть использование нескольких span_first запросов, заключенных в запрос must с переменным параметром end. Токен, появляющийся на первой позиции, будет соответствовать большему количеству запросов, чем токен на второй позиции и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...