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

本文关键字:请求 查询 net NEST Bool 未生 Elasticsearch | 更新日期: 2023-09-27 18:07:59

我试图在使用Bool查询的NEST中创建一个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"));

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

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

我试着拿出额外的突出显示和字段选择,以防引起问题,只留下查询和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对象。

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

我做错了什么?


指出

我使用了一个简单的QueryString的NEST的查询方法。它生成了预期的JSON请求,所以我很确定我配置的方式是正确的。

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

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

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

您的查询缺少.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"));

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