c# - 在Elasticsearch的查询DSL中使用 `MatchPhrasePrefix`

标签 c# elasticsearch nest querydsl

我是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
}

我在这里想念什么?

最佳答案

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讨论是否应在下一个主要版本中删除无条件查询。

关于c# - 在Elasticsearch的查询DSL中使用 `MatchPhrasePrefix`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58124809/

相关文章:

elasticsearch - Elastic Search NEST-如何在搜索中具有多个级别的过滤器

c# - 尽管已添加到我的项目中但无法使用 Bootstrap

c# - 在 TPL 数据流 TransformBlock 中使用 DeflateStream 和/或 CryptoStream

php - 使用Laravel在 Elasticsearch 中查询整数的匹配项

Elasticsearch - 配置没有分词器的小写分析器

asp.net - Elasticsearch .net客户端嵌套查询容器始终为null

c# - 在 ASP.NET Core 2.2 MVC 中查看内联文件时不显示自定义文件名

c# - 如何在T4模板中输出命名空间?

elasticsearch - AWS CodeBuild:使用elasticsearch单元测试构建应用程序无法以root身份运行

c# - Elasticsearch 7.x使用规范化器的不区分大小写排序