【发布时间】:2018-06-29 18:15:04
【问题描述】:
如何使通配符不区分大小写?
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
【问题讨论】:
标签: elasticsearch
如何使通配符不区分大小写?
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
【问题讨论】:
标签: elasticsearch
自 7.10 版起,wildcard 查询支持特殊参数 case_insensitive(布尔值)。
不区分大小写的搜索示例:
GET /_search
{
"query": {
"wildcard": {
"my_field": {
"value": "ki*y",
"case_insensitive": true
}
}
}
}
【讨论】:
通配符未分析。这取决于您为要搜索的字段提供的分析器。但如果您使用默认分析器,则通配符查询将返回 不区分大小写 结果。
示例:在示例索引中发布两个名称,一个是“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 字段类型。这就是为什么默认情况下它不会不区分大小写。
在我的情况下,这不是真的,默认情况下区分大小写 - 我使用的是 ES 7.2。 在您的示例中,字段的类型是“文本”而不是“关键字”
【讨论】:
我正在为 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}
}
}
}
}
});
}
【讨论】: