为啥使用 C#/ElasticSearch 进行此 NEST 通配符搜索没有返回任何文档?

Posted

技术标签:

【中文标题】为啥使用 C#/ElasticSearch 进行此 NEST 通配符搜索没有返回任何文档?【英文标题】:Why are no documents returned with this NEST wildcard search with C#/ElasticSearch?为什么使用 C#/ElasticSearch 进行此 NEST 通配符搜索没有返回任何文档? 【发布时间】:2021-07-16 13:53:49 【问题描述】:

此 NEST 通配符搜索返回零 (0) 个文档,尽管它应该返回,因为我的索引中有符合此条件的数据。这是一个有效的连接,设置断点时没有显示错误。有什么想法吗?

public class Book_ES


    public string book_title  get; set; 
     public string book_author  get; set; 


 sr_detailed = new SearchDescriptor<Book_ES>()


                    .Index("books_3").Take(10000)
                   .Query(a => a
                          .Bool(b => b
                            .Should(c => c
                              .Wildcard(d => d
                                
 .Field(f=>f.book_title).Field(g=>g.book_author).Value("A*")
                              )
                            )
                          )
                        
                    ).Highlight(h => h.Fields(f => f.Field("*").PreTags("<span class='hit' style='background-color:yellow'>").PostTags("</span>")))
                   ;

 var results = Esclient.Search<Book_ES>(sr_detailed);

【问题讨论】:

【参考方案1】:

你没有分享你的映射,但我认为它看起来像


  "books_3": 
    "mappings": 
      "properties": 
        "book_title": 
          "type": "text",
          "fields": 
            "keyword": 
              "type": "keyword",
              "ignore_above": 256
            
          
        ,
        "book_author": 
          "type": "text",
          "fields": 
            "keyword": 
              "type": "keyword",
              "ignore_above": 256
            
          
        
      
    
  

在这种情况下,当您将A* 作为通配符查询的值时,您不会得到任何结果,因为book_titlebook_author 都对文本字段使用标准分析器并且所有大写字符都被删除来自索引标记 - 对于此配置,elasticsearch 不会存储任何以 A 开头的标记,见下文

GET _analyze

  "analyzer": "standard",
  "text": "Test"



  "tokens" : [
    
      "token" : "test",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "<ALPHANUM>",
      "position" : 0
    
  ]

您可以在通配符查询中将case_insensitive 设置为true,这将解决您的问题为docs say

case_insensitive [7.10.0]在 7.10.0 中添加。 (可选,布尔值)允许 模式与索引字段值的不区分大小写匹配 当设置为真。默认为false,这意味着区分大小写 匹配取决于底层字段的映射。

【讨论】:

以上是关于为啥使用 C#/ElasticSearch 进行此 NEST 通配符搜索没有返回任何文档?的主要内容,如果未能解决你的问题,请参考以下文章

如果我可以通过 REST 将数据发送到 elasticsearch,为啥还要安装 logstash?

elasticsearch的实时搜索性能为啥比solr好

为啥 elasticsearch 获取节点信息失败

Elasticsearch java api 基本搜索部分详解

为啥 Visual C++ 2010 使用此汇编语法进行内存寻址?

使用 mypy 进行类型检查,我无法弄清楚为啥会发生此错误 [关闭]