Можно ли выполнять поиск по нескольким полям с помощью Elastic Search Java API?

Пример:

|studentname | maths | computers |
++++++++++++++++++++++++++++++++++
|s1          |78     |90         |
==================================
|s2          |56     |75         |
==================================
|s3          |45     |50         |
==================================

В приведенной выше таблице представлены данные, которые присутствуют в Elasticsearch.

Учтите, что пользователь вводит 60 and above, тогда Elasticsearch сможет отобразить только s1, потому что он единственный учащийся, набравший более 60 баллов по обоим предметам.

Как решить эту проблему с помощью Java API?

ПРИМЕЧАНИЕ. Я смог узнать по отдельным предметам:

    QueryBuilder query = QueryBuilders.boolQuery()
            .should(
                     QueryBuilders.rangeQuery(maths)
                    .from(50)
                    .to(100)
            )

person Abhishek Ekaanth    schedule 13.04.2017    source источник
comment
Сначала неправильно вас понял. Обновил мой ответ.   -  person Dmitry Minkovsky    schedule 13.04.2017


Ответы (1)


Вы можете иметь несколько предложений .should() в логическом запросе. Итак, в вашем случае:

QueryBuilder query = QueryBuilders.boolQuery()
        .should(
                 QueryBuilders.rangeQuery(maths)
                .from(61)
                .to(100)
        )
        .should(
                 QueryBuilders.rangeQuery(computers)
                .from(61)
                .to(100)
        )

Примечание:

  1. RangeQueryBuilder (возвращенный из QueryBuilders.rangeQuery()) также имеет метод #gte().

  2. Согласно документам: «В логическом запросе без предложений must или filter одно или несколько предложений должны соответствовать документу». Поэтому, если у вас нет filter или must, вы можете не получить желаемого поведения. Приведенный выше ответ предполагает, что вы используете некоторые другие предложения. Дело в том, что вы можете комбинировать предложения в логическом запросе. В случае API Java это просто означает повторное использование предложения.

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

person Dmitry Minkovsky    schedule 13.04.2017
comment
Превосходно :)! Обратите внимание: если вам не нужны подсчеты результатов, вы можете использовать filter вместо should. Это приведет к более быстрому выполнению и кэшированию (elastic.co/guide/en/elasticsearch/reference/current/) - person Dmitry Minkovsky; 13.04.2017
comment
разве это не должно совпадать со student2 (s2), так как у него оценка компьютеров выше 60. - person avr; 13.04.2017
comment
@avr да, я думал, что это возможно. Как сказано в документах: в логическом запросе без предложений must или filter одно или несколько предложений должны соответствовать документу. Но я оставил это на проверку ОП и не предполагал, что у него нет других пунктов. Я бы использовал filter или must вместо should. Я отредактирую ответ, спасибо. - person Dmitry Minkovsky; 13.04.2017
comment
Да, нам нужно использовать либо filter (я бы использовал фильтр, так как он более эффективен, чем запрос), либо must. - person avr; 13.04.2017
comment
Да, я обновил ответ со всеми этими примечаниями. Спасибо. - person Dmitry Minkovsky; 13.04.2017