ElasticSearch NEST ИЛИ запрос - PullRequest
       18

ElasticSearch NEST ИЛИ запрос

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

У меня возникли проблемы с созданием запроса, который выполняет поиск по разным полям. Я получил ответы, которые хотел получить, создав несколько запросов - но ради производительности - я хочу сделать это только одним запросом, если это возможно.

Я пытался настроить запрос в нескольких предложениях .Should , но кажется, что он ищет документы, которые соответствуют каждому полю, которое, я думаю, предназначено. Это выглядит так:

 .From(0)
             .Sort(sort => sort
             .Field("priority", SortOrder.Descending))
             .Sort(sort => sort
             .Ascending(a => a.ItemNumber.Suffix("keyword")))
             .Sort(sort => sort
             .Descending(SortSpecialField.Score))
             .TrackScores(true)
             .Size(25)
             .Query(qe => qe
             .Bool(b => b
                .Should(m => m
                   .Match(ma => ma
                      .Boost(1.1)
                      .Field("itemnumber")
                      .Query(ItemNumber)
                     ))
                 .Should(m => m
                    .Match(ma => ma
                        .Boost(1.1)
                        .Field("itemnumber2")
                        .Query(ItemNumber)))
                 .Should(m => m
                    .Match(ma => ma
                        .Boost(1.1)
                        .Field("ean")
                        .Query(ItemNumber)))
                 .Should(m => m
                    .Match(ma => ma
                        .Boost(1.1)
                        .Field("itemalias")
                        .Query(ItemNumber)))
                        )));

Я хочу, чтобы это было сделано; Выполните поиск по номеру товара и посмотрите, соответствует ли документ, если нет, то по номеру товара2 и так далее. Есть ли эффективный способ сделать это всего за один запрос?

Ответы [ 2 ]

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

Я считаю, что синтаксис для запроса should с несколькими частями должен быть массивом запросов. По-вашему, вы просто добавили бы несколько отдельных запросов. То, что вы хотите, должно выглядеть примерно так:

.Bool(b => b
    .Should(
        m => m
        .Match(ma => ma
            .Boost(1.1)
            .Field("itemnumber")
            .Query(ItemNumber)),
        m => m
        .Match(ma => ma
            .Boost(1.1)
            .Field("itemnumber2")
            .Query(ItemNumber)),
            m => m
        .Match(ma => ma
            .Boost(1.1)
            .Field("ean")
            .Query(ItemNumber)),
            m => m
        .Match(ma => ma
            .Boost(1.1)
            .Field("itemalias")
            .Query(ItemNumber)))

Подробнее здесь

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

Вы пытались использовать вместо этого запрос MultiMatch? https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html

Это позволит вам искать документы так же, как и в запросе на совпадение, но вы сможете указать несколько полей для поиска. Это позволит вам отказаться от запроса. запрос bool.

...