Nest Elasticsearch 通配符查询用作查询字符串,但不适用于 fluent API

Nest Elasticsearch wildcard query works as querystring but not with fluent API

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

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

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

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

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

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

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

假设您的映射看起来像这样:

{
  "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*"
      }
    }
  }
}

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

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

希望对您有所帮助。