0

我试图在 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"));

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

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

我尝试去掉额外的突出显示和字段选择,以防引起问题,只留下查询和布尔:

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 方法的提及,而且我无法通过反复试验来弄清楚。

我究竟做错了什么?


笔记

我使用了 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": {}
    }
  }
}
4

1 回答 1

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"));

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

于 2015-08-13T16:34:11.413 回答