如何在elasticsearch中匹配单词的一部分?

rya*_*lim 1 elasticsearch

如何将单词的一部分与父单词匹配?例如:我需要将“eese”或“heese”与“cheese”这个词匹配。

Val*_*Val 6

实现这一点的最佳方法是使用一个edgeNGram令牌过滤器与两个reverse令牌过滤相结合。因此,首先您需要定义一个reverse_analyzer在索引设置中调用的自定义分析器,如下所示。然后你可以看到我已经声明了一个字符串字段,它your_field带有一个子字段suffix,它定义了我们的自定义分析器。

PUT your_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "reverse_analyzer": {
          "tokenizer": "keyword",
          "filter" : ["lowercase", "reverse", "substring", "reverse"]
        }
      },
      "filter": {
        "substring": {
          "type": "edgeNGram",
          "min_gram": 1,
          "max_gram": 10
        }
      }
    }
  },
  "mappings": {
    "your_type": {
      "properties": {
        "your_field": {
          "type": "string",
          "fields": {
            "suffix": {
              "type": "string",
              "analyzer": "reverse_analyzer"
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以索引一个带有“cheese”的测试文档,如下所示:

PUT your_index/your_type/1
{"your_field": "cheese"}
Run Code Online (Sandbox Code Playgroud)

当此文档被索引时,该your_field.suffix字段将包含以下标记:

  • e
  • se
  • ese
  • eese
  • heese
  • cheese

索引时发生的情况cheese如下:

  1. 所述keyword标记生成器将记号化的单个令牌,=>cheese
  2. lowercase令牌滤波器将把令牌小写=>cheese
  3. reverse令牌滤波器将扭转令牌=>eseehc
  4. substring令牌滤波器将产生长度为1的不同的令牌至10 => ,eesese,,eseeeseeheseehc
  5. 最后,第二个reverse标记过滤器将再次反转所有标记 => e, se, ese, eese, heese,cheese
  6. 这些是所有将被索引的令牌

所以我们最终可以在该子字段中搜索eese(或任何后缀cheese)并找到我们的匹配项

POST your_index/_search
{
   "query": {
      "match": {
         "your_field.suffix": "eese"
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

=> 生成我们刚刚在上面索引的文档。