Elasticsearch 通配符区分大小写

Elasticsearch wildcard case-sensitive

如何使通配符不区分大小写?

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html


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

1
2
3
4
5
6
7
8
9
10
11
GET /_search
{
 "query": {
   "wildcard": {
     "my_field": {
       "value":"ki*y",
       "case_insensitive": true
      }
    }
  }
}


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

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

1
2
3
4
5
6
7
8
9
POST sample/sample
{
 "name" :"sid"
}

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

然后执行通配符查询:

1
2
3
4
5
6
7
8
9
10
GET sample/_search
{
 "query": {
   "wildcard": {
     "name": {
       "value":"s*"
      }
    }
  }
}

这将返回我两个文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
 "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"。


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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}
                    }
                }
            }
        }
    });
}


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