【问题标题】:Elasticsearch wildcard case-sensitiveElasticsearch 通配符区分大小写
【发布时间】:2018-06-29 18:15:04
【问题描述】:

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    自 7.10 版起,wildcard 查询支持特殊参数 case_insensitive(布尔值)。 不区分大小写的搜索示例:

    GET /_search
    {
      "query": {
        "wildcard": {
          "my_field": {
            "value": "ki*y",
            "case_insensitive": true
          }
        }
      }
    }
    

    【讨论】:

    • 这很棒。当我从 Kibana 发出查询时,这确实可以正常工作。不幸的是,我在他们的 .NET SDK 中看不到它。我将 NEST 7.11.1 用于 .NET,但我根本看不到“case_insensitive”选项。奇怪!
    【解决方案2】:

    通配符未分析。这取决于您为要搜索的字段提供的分析器。但如果您使用默认分析器,则通配符查询将返回 不区分大小写 结果。

    示例:在示例索引中发布两个名称,一个是“Sid”,另一个是“sid”。

    POST sample/sample
    {
      "name" : "sid"
    }
    
    POST sample/sample
    {
      "name" : "Sid"
    }
    

    然后执行通配符查询:

    GET sample/_search
    {
      "query": {
        "wildcard": {
          "name": {
            "value": "s*"
          }
        }
      }
    }
    

    这会将两个文件都返回给我:

    {
      "took": 10,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 2,
        "max_score": 1,
        "hits": [
          {
            "_index": "sample",
            "_type": "sample",
            "_id": "AWRPM87Wb6oopELrnEKE",
            "_score": 1,
            "_source": {
              "name": "Sid"
            }
          },
          {
            "_index": "sample",
            "_type": "sample",
            "_id": "AWRPM9tpb6oopELrnEKF",
            "_score": 1,
            "_source": {
              "name": "sid"
            }
          }
        ]
      }
    }
    

    但是,如果您对“S*”执行通配符查询,它将不会返回任何内容。因为默认标记过滤器以小写形式存储术语,并且术语“Sid”在倒排索引中存储为“sid”。

    【讨论】:

    • 建议使用wildcard 查询与不支持分析器和规范器的特殊wildcard 字段类型。这就是为什么默认情况下它不会不区分大小写。
    【解决方案3】:

    在我的情况下,这不是真的,默认情况下区分大小写 - 我使用的是 ES 7.2。 在您的示例中,字段的类型是“文本”而不​​是“关键字”

    【讨论】:

      【解决方案4】:

      我正在为 nodejs 客户端寻找相同的选项,所以遇到了这个问题,因此发布作为答案可能对其他人有所帮助。

      我必须将术语转换为小写,它对我有用*${term.toLowerCase()}* 这是完整的功能

      searchUsers(term, from, limit) {
          let users = await EsClient.search({
              index: 'users',
              type: 'users',
              body: {
                  from,
                  size: limit,
                  query: {
                      bool: {
                          should: [
                              {
                                  wildcard: {
                                      email: {
                                          value: `*${term.toLowerCase()}*`
                                      }
                                  }
                              },
                              {
                                  wildcard: {
                                      "name.keyword": {
                                          value: `*${term.toLowerCase()}*`
                                      }
                                  }
                              }
                            ],
                          must_not: {
                              terms: {_id: blacklist}
                          }
                      }
                  }
              }
          });
      }
      

      【讨论】:

      • 这对我使用 elasticsearch 6.2 和 c# nest api 有效
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      相关资源
      最近更新 更多