【问题标题】:Elasticsearch.net NEST Bool Query not generating expected requestElasticsearch.net NEST Bool 查询未生成预期请求
【发布时间】:2015-08-13 16:03:16
【问题描述】:

我正在尝试在 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": {}
    }
  }
}

【问题讨论】:

    标签: c# elasticsearch nest elasticsearch-net


    【解决方案1】:

    您的查询缺失.OnField(f =&gt; 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"));
    

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

    【讨论】:

    • 谢谢,它适用于 Match 子句,但 MatchPhrase 仍然被忽略(即使我自己使用它)。知道为什么会这样吗?
    • 我想补充一点,在 6.x 版本中,您必须在 Match 子句中使用 Field 方法而不是 OnField。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2015-08-06
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多