Nest Elasticsearch通配符查询可用作查询字符串,但不能与流畅的API一起使用

我的索引中大约有一百个测试文档,这些文档是使用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而不是querystring。

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

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

chenyd214 回答:Nest Elasticsearch通配符查询可用作查询字符串,但不能与流畅的API一起使用

假设您的映射如下所示:

{
  "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在内部仅存储第一个。

希望有帮助。

本文链接:https://www.f2er.com/3163292.html

大家都在问