Elasticsearch 空格分隔名称以外的单词

Elasticsearch spaces to seperate words except for names

我们正在构建一个带有 elasticsearch 的搜索机,供我们公司的实习生使用。 我们正在使用一个输入框,用户可以在其中输入他们的搜索词(Google 喜欢)。 所以应该可以搜索一种由空格分隔的不同类型的词。

一切正常,但我们在命名方面遇到了一些问题…… 如果我们搜索“Tim Van De Velde”,没有“Tim vandevelde”的结果,这应该是可能的。 请记住,我们希望在单词之间保留空格以使用我们的和运算符,并且我们不希望出现许多不正确的结果。

关于我们如何使这成为可能的任何想法或想法?

看看我们的查询:

"filtered": {
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "type": "most_fields",
            "query": "Tim Van De Velde",
            "operator": "and",
            "boost": 1,
            "fields": [
              "fullname",
              "alias",
              "name"
            ]
          }
        } ,
        {
          "multi_match": {
            "type": "most_fields",
            "query": "Tim Van De Velde",
            "operator": "and",
            "fields": [
              "fullname",
              "alias",
              "name"
            ],
            "boost": 0.8,
            "fuzziness": 1
          }
        }

您正在寻找的可能是一种用于化合物名称的分解分析器,就像您提到的那样。另一种方法是使用 ngrams 分析器,它将在您的名字上滑动 window 个 n 字符。这种方法给你一个很好的召回率,但不知何故精度较差。所以我会先尝试使用分解分析仪,然后 ngrams

以下插件可以处理复合词:Analysis Decompound. It works without a dictionary. For a dictionary based approach use the Compound Word Token Filter

使用插件 1 时,您提到的名称将被拆分为以下标记:

{
   "tokens": [
      {
         "token": "tim",
      },
      {
         "token": "vandeveld",
      },
      {
         "token": "vand",
      },
      {
         "token": "veld",
      }
   ]
}

有一种简单的方法可以实现您的目标:查询预处理。

  • 字典人名
  • 接收输入为“Tim Van De Velde”和return输出为["Tim Van De Velde"或"TimVan De Velde"或"Tim VanDe Velde"或"Tim Van DeVelde"或"TimVanDe Velde" 或 "TimVan DeVelde" 或 "TimVanDeVelde" 或 "Tim Van DeVelde" 或 "Tim VanDeVelde" 或 "TimVanDeVelde" ]