Elasticsearch.net NEST Bool Query не генерирует ожидаемый запрос

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

Это код, который я пробовал:

var query = "my query";
var fileType = "Poster";
var searchResults = _client.Search<Doc>(s => 
        s.Query(q =>
            q.Bool(
                b => b.Must(
                    m =>  m.MatchPhrase(mp =>
                        mp.Query(query).Fuzziness(2))
                    ).Must(m => m.Match(
                        mp => mp.Query(fileType))))
            ).Highlight(x =>
                    x.OnFields(y =>
                        y.OnField(f => f.File)
                         .PreTags("<strong>")
                         .PostTags("</strong>"))
            ).Fields("fileType", "title"));

Вот запрос JSON, который NEST генерирует из этого кода. Обратите внимание, что отсутствует все свойство запроса:

{
  "highlight": {
    "fields": {
      "file": {
        "pre_tags": [
          "<strong>"
        ],
        "post_tags": [
          "</strong>"
        ]
      }
    }
  },
  "fields": [
    "fileType",
    "title"
  ]
}

Я попытался убрать дополнительную подсветку и выбор поля, если это вызывало проблему, просто оставив Query и Bool:

var searchResults = _client.Search<Doc>(s => 
        s.Query(q =>
            q.Bool(
                b => b.Must(
                    m =>  m.MatchPhrase(mp =>
                        mp.Query(query).Fuzziness(2))
                    )
                .Must(m => m.Match(mp => mp.Query(fileType))))
            ));

Этот код создает пустой объект JSON.

Я не смог найти упоминания о методах Bool и Must в документации NEST, и я не смог понять это методом проб и ошибок.

Что я делаю не так?


Примечания

Я использовал метод Query NEST с простой строкой запроса. Он сгенерировал ожидаемый запрос JSON, поэтому я почти уверен, что все настроено правильно.

Это запрос JSON, который я пытаюсь воссоздать с помощью NEST:

{
  "fields": [
    "title",
    "fileType"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "fileType": {
              "query": "Poster"
            }
          }
        },
        {
          "match_phrase": {
            "file": {
              "query": "my query",
              "fuzziness": 2
            }
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "file": {}
    }
  }
}

person Sam    schedule 13.08.2015    source источник


Ответы (1)


Ваши запросы отсутствуют .OnField(f => f.YourField). NEST игнорирует такие запросы из-за без условий.

Я надеюсь, что это ясно прямо сейчас.

обновить

Вы должны изменить свой запрос на что-то вроде этого:

var searchResults = client.Search<Doc>(s => s
    .Query(q => q
        .Bool(b => b
            .Must(
                m => m.Match(mp => mp.OnField(f => f.YourField).Query(fileType)),
                m => m.MatchPhrase(mp => mp.OnField(f => f.YourField).Query(query).Fuzziness(2)))
                ))
    .Highlight(x => x
        .OnFields(y => y
            .OnField(f => f.File)
            .PreTags("<strong>")
            .PostTags("</strong>")))
    .Fields("fileType", "title"));

Вы должны использовать .Must(..) только один раз в логическом запросе, иначе вы замените предыдущее определение .Must(..). К счастью, вы можете передать несколько запросов в метод .Must(..).

person Rob    schedule 13.08.2015
comment
Спасибо, это работает для предложения Match, но MatchPhrase по-прежнему игнорируется (даже когда я использую его сам по себе). Любая идея, почему это может быть? - person Sam; 13.08.2015
comment
Я просто хотел бы добавить, что в версии 6.x вы должны использовать метод Field вместо OnField в предложении Match. - person BineG; 23.05.2018