假设我已经索引了这些数据
song:{
title:"laser game"
}
Run Code Online (Sandbox Code Playgroud)
但用户正在搜索
lasergame
Run Code Online (Sandbox Code Playgroud)
您将如何对此进行映射/索引/查询?
这是一个棘手的问题。
1)我想最有效的方法可能是使用复合令牌过滤器,由word list您认为用户可能连接的一些单词组成。
"settings": {
"analysis": {
"analyzer": {
"concatenate_split": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"myFilter"
]
}
},
"filter": {
"myFilter": {
"type": "dictionary_decompounder",
"word_list": [
"laser",
"game",
"lean",
"on",
"die",
"hard"
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
应用分析器后,Lasergame将分为Laser和Game以及LaserGame,现在这将为您提供包含任何这些单词的结果。
2)另一种方法可以是将整个标题与模式替换字符过滤器连接起来,替换所有空格。
{
"index" : {
"analysis" : {
"char_filter" : {
"my_pattern":{
"type":"pattern_replace",
"pattern":"\\s+",
"replacement":""
}
},
"analyzer" : {
"custom_with_char_filter" : {
"tokenizer" : "standard",
"char_filter" : ["my_pattern"]
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您需要使用multi fields这种方法,使用此方法pattern,laser game将被索引为Lasergame并且您的查询将起作用。这里的问题是激光游戏将被索引为lasegameplay并且搜索Lasergame不会返回任何内容,因此您可能需要考虑使用prefix query或wildcard query。
3)这可能没有意义,但如果您认为用户经常连接某些单词,您也可以使用同义词过滤器。
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
1401 次 |
| 最近记录: |