如何使通配符不区分大小写?
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
答案 0 :(得分:4)
自 7.10 版起,setMenu
查询支持特殊参数 step="0.01"
(布尔值)。
不区分大小写的搜索示例:
wildcard
答案 1 :(得分: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”。
答案 2 :(得分:1)
我一直在为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}
}
}
}
}
});
}
答案 3 :(得分:0)
在我的情况下,这是不正确的,默认情况下区分大小写-我使用的是ES 7.2。 在您的示例中,字段的类型是“文本”而不是“关键字”