我需要匹配整个字段,但要使用小写和asiifolding令牌过滤器。在Elasticsearch中有可能吗?
例如,如果我有一个产品的“标题”字段,并且产品标题是“ PotovalniKovček”。并且用户搜索查询为“ potovalni kovcek”,那么我需要返回此产品作为结果。但前提是整个标题与搜索查询匹配。如果用户搜索查询是“ potovalni”,“ Potovalni”或“ kovcek”,则不会返回任何结果。
我可以使用小写字母和asiifolding令牌过滤器创建术语查询吗?我不知道该怎么做。
答案 0 :(得分:1)
我要做的是将title
字段定义为keyword
,并使用custom normalizer来完成这项工作。
首先让我们创建索引:
PUT test
{
"settings": {
"analysis": {
"normalizer": {
"exact": {
"type": "custom",
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
},
"mappings": {
"doc": {
"properties": {
"title": {
"type": "keyword",
"normalizer": "exact"
}
}
}
}
}
然后,我们为示例文档建立索引:
PUT test/doc/1
{
"title": "Potovalni Kovček"
}
最后,我们可以搜索:
# Record 1 is returned
POST test/_search
{
"query": {
"term": {
"title": "Potovalni Kovček"
}
}
}
# Record 1 is returned
POST test/_search
{
"query": {
"term": {
"title": "potovalni kovcek"
}
}
}
# No record is returned
POST test/_search
{
"query": {
"term": {
"title": "potovalni"
}
}
}
# No record is returned
POST test/_search
{
"query": {
"term": {
"title": "kovcek"
}
}
}