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

时间:2015-08-13 16:03:17

标签: 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"));

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

{
  "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方法的提及,但我无法通过反复试验来解决这个问题。

我做错了什么?

备注

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

1 个答案:

答案 0 :(得分:5)

您的查询遗失.OnField(f => f.YourField)。 由于conditionless,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(..)方法。