我们有一个ElasticSearch索引,其中一些字段使用自定义分析器。其中一个分析器包含Wrapped1
令牌过滤器,以便在进行查询时摆脱区分大小写(例如,我们希望"球"也匹配" Ball"或&# 34; BALL&#34)
这里的问题是在进行正则表达式时,模式与索引中的术语匹配,该术语全部为大写。所以" app *"赢得了比赛" Apple"在我们的索引中,因为它在幕后真正被索引为" APPLE"。
有没有办法让这个工作没有在ES之外做一些hacky事情?
我可能会使用" query_string"相反,看看是否有任何不同的结果。
答案 0 :(得分:0)
这一切都取决于您使用的查询类型。如果该类型将使用字段本身的分析器来分析输入字符串,那么它应该没问题。
如果您正在使用regexp
查询,则此查询不会分析输入字符串,因此如果您将app.*
传递给它,它将保持不变,这就是用户搜索的内容
但是,如果您正确地使用 query_string
查询应该有效:
{
"settings": {
"analysis": {
"analyzer": {
"my": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"uppercase"
]
}
}
}
},
"mappings": {
"test": {
"properties": {
"some_field": {
"type": "text",
"analyzer": "my"
}
}
}
}
}
查询本身:
{
"query": {
"query_string": {
"query": "some_field:app*"
}
}
}
为了确保它按照我的想法行事,我总是使用_validate
api:
GET /_validate/query?explain&index=test
{
"query": {
"query_string": {
"query": "some_field:app*"
}
}
}
将显示ES对输入字符串执行的操作:
"explanations": [
{
"index": "test",
"valid": true,
"explanation": "some_field:APP*"
}
]