【问题标题】:Using `MatchPhrasePrefix` in query DSL of Elasticsearch在 Elasticsearch 的查询 DSL 中使用“MatchPhrasePrefix”
【发布时间】:2019-09-26 21:08:23
【问题描述】:

我是 Elasticsearch 的新手。

谁能解释一下为什么要搜索 (NEST 6):

var searchResponse1 = this.elasticClient.Search<dynamic>(
    s => s.AllTypes().AllIndices().IgnoreUnavailable().Size(100).From(0)
        .Query(q => q.Bool(b => b.Must(m => m.SimpleQueryString(c => c.Query("query"))))));

正确地导致以下请求(我使用 Fiddler 得到了这个):

POST https://someUrl.com/_search?pretty=true&error_trace=true&typed_keys=true&ignore_unavailable=true HTTP/1.1
{
  "from": 0,
  "query": {
    "bool": {
      "must": [
        {
          "simple_query_string": {
            "query": "query"
          }
        }
      ]
    }
  },
  "size": 100
}

但以下两个搜索“MatchPhrasePrefix”:

var searchResponse2 = this.elasticClient.Search<dynamic>(
    s => s.AllTypes().AllIndices().IgnoreUnavailable().Size(100).From(0)
        .Query(q => q.Bool(b => b.Must(m => m.MatchPhrasePrefix(c => c.Query("query"))))));

var searchResponse3 = this.elasticClient.Search<dynamic>(
    s => s.AllTypes().AllIndices().IgnoreUnavailable().Size(100).From(0)
        .Query(q => q.MatchPhrasePrefix(p => p.Query("query"))));

结果:

POST https://someUrl.com/_search?pretty=true&error_trace=true&typed_keys=true&ignore_unavailable=true HTTP/1.1
{
  "from": 0,
  "size": 100
}

我在这里错过了什么?

【问题讨论】:

    标签: c# elasticsearch nest querydsl


    【解决方案1】:

    MatchPhrasePrefix 查询必须还指定要定位的字段。例如

    var searchResponse2 = client.Search<dynamic>(s => s
        .AllTypes()
        .AllIndices()
        .IgnoreUnavailable()
        .Size(100)
        .From(0)
        .Query(q => q
            .Bool(b => b
                .Must(m => m
                    .MatchPhrasePrefix(c => c
                        .Field("some_field") // <-- target the "some_field" field
                        .Query("query")
                    )
                )
            )
        )
    );
    

    查询结果

    POST /_search
    {
      "from": 0,
      "query": {
        "bool": {
          "must": [
            {
              "match_phrase_prefix": {
                "some_field": {
                  "query": "query"
                }
              }
            }
          ]
        }
      },
      "size": 100
    }
    

    如果不指定字段,则查询在客户端被视为无条件,并将从响应中省略。 an issue 讨论是否应该在下一个主要版本中删除 无条件 查询。

    【讨论】:

    • 所以没有办法针对所有字段,对吧?
    • 在 6.x 中,如果您启用了 _all 字段(可能是从 5.x 升级的索引的情况),或者配置了您自己的 copy_to 字段,您可以定位此字段:elastic.co/guide/en/elasticsearch/reference/6.8/….
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 2019-11-13
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多