Elasticsearch wildcard case-sensitive
如何使通配符不区分大小写?
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
自 7.10 版起,
不区分大小写的搜索示例:
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 客户端寻找相同的选项,所以遇到了这个问题,所以发布作为答案可能对其他人有帮助。
我必须将术语转换为小写,它对我有用
这是完整的功能
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。
在您的示例中,字段的类型是"文本"而不??是"关键字"