Elasticsearch.net NEST Bool查询未生成预期的请求

Sam*_*Sam 0 c# elasticsearch nest elasticsearch-net

我试图在NEST中创建一个使用Bool查询的Elasticsearch查询,但是我放在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"));
Run Code Online (Sandbox Code Playgroud)

这是NEST从该代码生成的JSON请求。请注意,它缺少整个查询属性:

{
  "highlight": {
    "fields": {
      "file": {
        "pre_tags": [
          "<strong>"
        ],
        "post_tags": [
          "</strong>"
        ]
      }
    }
  },
  "fields": [
    "fileType",
    "title"
  ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试去除多余的突出显示和字段选择,以防造成问题,只是离开了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))))
            ));
Run Code Online (Sandbox Code Playgroud)

此代码生成一个空的JSON对象。

我在NEST文档中找不到Bool和Must方法的提法,也无法通过反复试验弄清楚。

我究竟做错了什么?


笔记

我已经使用了NEST的Query方法和一个简单的QueryString。它生成了预期的JSON请求,因此我很确定我配置的方式是正确的。

这是我尝试使用NEST重新创建的JSON查询:

{
  "fields": [
    "title",
    "fileType"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "fileType": {
              "query": "Poster"
            }
          }
        },
        {
          "match_phrase": {
            "file": {
              "query": "my query",
              "fuzziness": 2
            }
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "file": {}
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 5

您的查询丢失了.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"));
Run Code Online (Sandbox Code Playgroud)

.Must(..)在布尔查询中只能使用一次,否则将替换以前的.Must(..)定义。幸运的是,您可以将多个查询传递给该.Must(..)方法。