我想使用ES索引大量名称。 我想区分每个单词中的辅音和元音,并能够根据每个字母的位置进行搜索,如果它是辅音或元音。
所以说出这样的名字:
JOHN
我想输入:
CVCC
当我运行搜索时,JOHN
应该在结果集中。
有可能以某种方式在弹性搜索中对名称进行索引,以便我可以使用标记C和V对元音进行索引然后搜索它们吗?
所以Elasticsearch必须为每个单词的每个位置索引字符类型,如何做到这一点?
答案 0 :(得分:3)
您可以使用自定义分析器中的pattern_replace
字符过滤器来完成此操作。此外,在我的解决方案中,我使用了自定义分析器的子字段,可能会想要在名称字段上进行其他类型的搜索,辅音 - 元音只是其中之一。
DELETE test
PUT test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "keyword",
"char_filter": [
"replace_filter_lowercase_CONS",
"replace_filter_uppercase_CONS",
"replace_filter_lowercase_VOW",
"replace_filter_uppercase_VOW"
]
}
},
"char_filter": {
"replace_filter_lowercase_CONS": {
"type": "pattern_replace",
"pattern": "[b-df-hj-np-tv-z]{1}",
"replacement": "c"
},
"replace_filter_uppercase_CONS": {
"type": "pattern_replace",
"pattern": "[B-DF-HJ-NP-TV-Z]{1}",
"replacement": "C"
},
"replace_filter_lowercase_VOW": {
"type": "pattern_replace",
"pattern": "[aeiou]{1}",
"replacement": "v"
},
"replace_filter_uppercase_VOW": {
"type": "pattern_replace",
"pattern": "[AEIOU]{1}",
"replacement": "V"
}
}
}
},
"mappings": {
"test": {
"properties": {
"name": {
"type": "text",
"fields": {
"cons_vow": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
}
}
}
POST /test/test/1
{"name":"JOHN"}
POST /test/test/2
{"name":"Andrew"}
POST /test/test/3
{"name":"JOhn DOE"}
GET /test/_search
{
"query": {
"term": {
"name.cons_vow": {
"value": "CVCC"
}
}
}
}