index/_analyze
{
"analyzer": "autocomplete",
"field": "name",
"text": "жаб"
}
给了我正确的标记:
{
"tokens": [{
"token": "žab",
"start_offset": 0,
"end_offset": 3,
"type": "<ALPHANUM>",
"position": 0
}]
}
现在,当我将令牌
žab
插入搜索时,它可以工作,它给了我结果。
解释查询:
index/_validate/query?explain
{
"query": {
"match": {
"name": "жаб"
}
}
}
给我
{
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"valid": true,
"explanations": [
{
"index": "places_for_search",
"valid": true,
"explanation": "name:žab"
}
]
}
所以它被转换成
žab
。
但是当我有
{
"query": {
"match": {
"name": "жаб"
}
}
}
它没有给我任何结果,但它应该,因为
žab
给了我结果。
我什至尝试像这样强制分析器:
{
"query": {
"multi_match": {
"query": "жаб",
"type": "bool_prefix",
"fields": [
"name"
],
"analyzer": "autocomplete"
}
}
}
但仍然没有结果。
只是为了论证,我的文档如下所示:
{
"id": "ChIJT3DV8zM5TRMRlVS4y79AH7A",
"name": "Žabljak"
}
字段
name
具有自动完成分析器:
{
"type": "search_as_you_type",
"doc_values": false,
"max_shingle_size": 3,
"analyzer": "autocomplete",
"search_analyzer": "autocomplete"
}
所以底线是,分析器可以工作,但不知何故,它没有在查询中使用,至少没有在查询结果中使用。知道如何进一步调试吗?
Elasticsearch 使用分析器进行搜索和索引。 根据您分享的示例,由于您的分析器
жаб
在索引期间转换为 žab
。这当然也适用于搜索过程。当您搜索 жаб
时,它将在索引数据中搜索 žab
。
查看以下
_analyze
API调用结果。
POST _analyze
{
"analyzer": "autocomplete",
"text": "Žabljak"
}
您是否在回复中看到
žab
为"token": "žab"
?如果不是就无法匹配...
让我们调试一下:
_analyze
原始数据和搜索模式。žab
不等于 Žab
如果需要,请使用 小写 tokenfilter。Žabljak
分词为 => žab
, abl
, blj
...