我正在尝试实现一个需要使用Edge NGRAM Tokenizer的搜索系统。创建索引的设置如下所示。我对文档和搜索查询都使用了相同的分词器。 (文档使用Perisan语言)
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"tokenizer": "autocomplete",
"filter": [
"lowercase"
]
},
"autocomplete_search": {
"tokenizer": "autocomplete"
}
},
"tokenizer": {
"autocomplete": {
"type": "edge-ngram",
"min_gram": 2,
"max_gram": 10,
"token_chars": [
"letter"
]
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "autocomplete_search"
}
}
}
}
}
当我在文档中使用数据:'آلمانخوباست'时,在文档中搜索术语'آلمانی'得到0次点击(结果)时,就会出现问题。
如您所见,对术语“آلمانی”进行分析的结果表明,它生成了令牌“آلمان”并且工作正常。
{
"tokens" : [
{
"token" : "آ",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "آل",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "آلم",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "آلما",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "آلمان",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "آلمانی",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
}
]
}
下面显示的搜索查询获得0次匹配。
GET /test/_search
{
"query": {"match": {
"title": {"query": "آلمانی" , "operator": "and"}
}}
}
但是,搜索词“آلما”会返回包含数据“آلمانخوباست”的文档。 我该如何解决这个问题?
非常感谢您的协助。
答案 0 :(得分:1)
我发现Ricardo Heck的这篇DevTicks帖子解决了我的问题。 enter the link for more detailed description
我这样更改了映射设置:
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "autocomplete_search",
"fields": {
"ngram": {
"type": "text",
"analyzer": "autocomplete"
}
}
}
}
}
}
现在,通过搜索术语“آلمانی”,我得到了文档“آلمانخوباست”。