Сопоставьте фразовый запрос с несколькими полями в elasticsearch, используя гнездо

Я пытаюсь выполнить запрос, используя matchphrase, но в нескольких полях, но мое гнездо позволяет мне делать это только в одном поле, вот мой фрагмент кода

    var result = client.Search<document>(s => s
    .Analyzer("automplete")
    .Query(p => p
    .MatchPhrase(M => M
    .OnField("description")
    .Query(value))));

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

Пожалуйста, помогите мне с этим - заранее спасибо!


person pavan sp    schedule 06.01.2016    source источник


Ответы (1)


match_phrase даже не поддерживает несколько полей. Для использования запроса match по нескольким полям необходимо использовать multi_match запрос.

var result = client.Search<document>(s => s
    .Analyzer("automplete")
    .Query(p => p
        .MultiMatch(m => m
            .OnFields(new[] { "description" /*, add other fields here */ })
            .Query(value)
            .Type(TextQueryType.Phrase))));
person bittusarkar    schedule 06.01.2016
comment
@bittusarkar: спасибо за ответ.. Он мне очень помог.. И еще один вопрос. Как я могу инициализировать var result заранее, как мы это делаем string result = string.empty. Могу ли я сделать то же самое для elasticsearch?? ТИА :) - person ASN; 23.05.2016
comment
@ASN Я не понял твоего вопроса. Что бы вы вообще хотели сделать? Вы всегда можете инициализировать его с помощью null. - person bittusarkar; 23.05.2016
comment
Как я могу инициализировать ответ var заранее, как мы это делаем string result = string.empty. Могу ли я сделать то же самое для elasticsearch?? Обычно мы используем var response= client.search<className>(//some code here); Вместо этого я хочу сначала инициализировать response, а затем использовать параметр позже в коде. Надеюсь, теперь вы поняли, иначе я могу отправить вам письмо, если вы поделитесь своим почтовым идентификатором. - person ASN; 23.05.2016
comment
Я хочу написать условие if else, которое принимает два разных запроса, но обработка результата после получения ответа одинакова. поэтому хотел инициализировать его перед циклом if-else. Я попытался инициализировать его нулем, и он выдал ошибку, поскольку мы приравниваем его к ответу поиска после инициализации. Поэтому я инициализировал с помощью var response = (ISearchResponse<className>)null;. Это послужило цели. Спасибо. Ваш ответ натолкнул меня на мысль. :) - person ASN; 23.05.2016
comment
О, не используйте var в этом случае. Простого ISearchResponse<className> response = null; должно хватить :) - person bittusarkar; 23.05.2016