Как создать сложный запрос к Elasticsearch с помощью OR logi c, используя Spring Data Elasticsearch? - PullRequest
0 голосов
/ 27 февраля 2020

Я ищу лучший подход для создания сложного запроса к Elasticsearch с помощью логики OR c из java.

Мне действительно нужно что-то вроде ((A и B) или (C и D) или (E и F и G)) .

Теперь я использую ElasticsearchTemplate и org.springframework.data.elasticsearch.core.query.Criteria.class.

Но я не могу реализовать ИЛИ logi c в одном запросе, и мне приходится делать отдельные запросы к Elasticsearch:

  • один для (A и B) ,
  • один для (C и D) и т. Д. ...

Ответы [ 4 ]

1 голос
/ 27 февраля 2020

В настоящее время это невозможно, для этого существует проблема Jira . Это одна из проблем, которую я хотел бы решить как можно скорее, но в данный момент мы работаем над подготовкой версии 4.0.

Увы, для этого нужно полностью переписать класс Criteria чтобы иметь эту функциональность, но, конечно, мы не должны нарушать существующую функциональность. Так что это не то, что можно сделать с помощью быстрого исправления (в противном случае я исправил бы это уже в декабре прошлого года).

1 голос
/ 27 февраля 2020

Вы можете моделировать ИЛИ и И И Запросы с логическими запросами:

В вашем примере это:

boolQuery().should(boolQuery().must(A).must(B)) .should(boolQuery().must(C).must(D)) .should(boolQuery().must(E).must(F).must(G));

0 голосов
/ 27 февраля 2020

Обновление: Извините, у меня были неправильные логи c, поскольку оператор AND имеет преимущество перед оператором ИЛИ, простое удаление скобки будет работать

Я думаю, что следующие логи c будут работать

((A и B) или (C и D) или (E и F и G)) = A и B или C и D или E и F и G

0 голосов
/ 27 февраля 2020

AND вasticSearch - это должен быть OR, если должен, и у вас слишком MustNot для AND NOT

Вы можете объединить их с помощью запроса bool, как в этом примере https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

...