【问题标题】:Nest Elasticsearch wildcard query works as querystring but not with fluent APINest Elasticsearch 通配符查询用作查询字符串,但不适用于 fluent API
【发布时间】:2019-11-04 22:44:57
【问题描述】:

我的索引中有大约一百个测试文档,使用 NBuilder 构建:

[
  {
    "title" : "Title1",
    "text" : "Text1"
  },
  {
    "title" : "Title2",
    "text" : "Text2"
  },
  {
    "title" : "Title3",
    "text" : "Text3"
  }
]

我想用通配符查询它们以查找所有以“文本”开头的项目。但是当我在 Nest 中使用两种通配符方法时,我得到了两种不同的结果。

var response = await client.SearchAsync<FakeFile>(s => s.Query(q => q
    .QueryString(d => d.Query("text:Text*")))
    .From((page - 1) * pageSize)
    .Size(pageSize));

这将返回 100 个结果。但我正在尝试使用流畅的 API 而不是查询字符串。

var response = await client.SearchAsync<FakeFile>(s => s
    .Query(q => q
        .Wildcard(c => c
            .Field(f => f.Text)
            .Value("Text*"))));

这将返回 0 个结果。我是 Elasticsearch 的新手。我试图让这个例子尽可能简单,以确保我能逐个理解它。我不知道为什么第二个查询没有返回任何内容。请帮忙。

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    假设您的文本字段是text 类型,那么在索引期间,elasticsearch 会将Text1 存储为内部倒排索引中的text1。使用查询字符串查询时会发生完全相同的分析,但使用通配符查询时不会发生。

    .QueryString(d =&gt; d.Query("text:Text*"))) 查找 text*.Wildcard(c =&gt; c.Field(f =&gt; f.Text).Value("Text*"))) 查找 Text* 但 elasticsearch 仅在内部存储第一个。

    希望对您有所帮助。

    【讨论】:

    • 所以基本上 Elasticsearch 是不区分大小写的,但同时区分大小写?我试过这个并且它有效。谢谢。
    • 这取决于您使用的文本字段类型。默认情况下它是文本,一开始你可以认为它不区分大小写,但我建议在权威指南中通过analysis chapter。这将帮助您了解不同的文本搜索方法。
    【解决方案2】:

    假设您的映射如下所示:

    {
      "mappings": {
        "doc": {
          "properties": {
            "title": {
              "type": "text"
            },
            "text":{
              "type": "text"
            }
          }
        }
      }
    }
    

    试试这个(应该是小写的):

    var response = await client.SearchAsync<FakeFile>(s => s
    .Query(q => q
        .Wildcard(c => c
            .Field(f => f.Text)
            .Value("text*"))));
    

    或者这个(不知道f.Text上面有没有text属性):

    var response = await client.SearchAsync<FakeFile>(s => s
    .Query(q => q
        .Wildcard(c => c
            .Field("text")
            .Value("text*"))));
    

    Kibana 语法:

    GET index/_search
    {
      "query": {
        "wildcard": {
          "text": {
            "value": "text*"
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多