在 Elasticsearch 中查找连接单词

Ras*_*mus 5 elasticsearch

假设我已经索引了这些数据

song:{
  title:"laser game"
}
Run Code Online (Sandbox Code Playgroud)

但用户正在搜索

lasergame
Run Code Online (Sandbox Code Playgroud)

您将如何对此进行映射/索引/查询?

Chi*_*h25 4

这是一个棘手的问题。

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将分为LaserGame以及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这种方法,使用此方法patternlaser game将被索引为Lasergame并且您的查询将起作用。这里的问题是激光游戏将被索引为lasegameplay并且搜索Lasergame不会返回任何内容,因此您可能需要考虑使用prefix querywildcard query

3)这可能没有意义,但如果您认为用户经常连接某些单词,您也可以使用同义词过滤器。

希望这可以帮助!