首页 > 解决方案 > 弹性搜索 - 应用适当的分析器来获得准确的结果

问题描述

我是弹性搜索的新手。我想应用任何满足以下搜索的分析器。让我们举个例子。假设我在文档中输入了以下文本

  1. 我现在走路
  2. 我走到艾哈迈达巴德
  3. 每天早上我走路
  4. 阿尼尔在晚上散步。
  5. 我正在招聘候选人
  6. 我聘请了候选人
  7. 我每天都招聘候选人
  8. 他聘请候选人

现在当我搜索

  1. 文本“walking”结果应该是 [walking, walk, walk, walks]
  2. 文本“walked”结果应该是 [walking, walk, walk, walks]
  3. 文本“walk”的结果应该是 [walking, walk, walk, walks]
  4. 文本“walks”结果应为 [walking, walk, walk, walks]

同样的结果也应该出租。

  1. 文本“招聘”结果应该是[招聘,雇用,雇用,雇用]
  2. 文本“雇用”结果应该是 [雇用,雇用,雇用,雇用]
  3. 文本“雇用”结果应该是[雇用,雇用,雇用,雇用]
  4. 文本“雇用”结果应该是[雇用,雇用,雇用,雇用]

谢谢你,

标签: elasticsearchtokenelastic-stacktokenize

解决方案


您需要使用词干过滤器

词干提取是将单词简化为词根形式的过程。这确保了在搜索期间单词匹配的变体。

例如,walking 和 walk 可以被提取为同一个词根:walk。一旦词干化,任何一个词的出现都会在搜索中与另一个词匹配。

映射

PUT index36
{
  "mappings": {
    "properties": {
      "title":{
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }, 
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "whitespace",
          "filter": [ "stemmer" ,"lowercase"]
        }
      }
    }
  }
}

分析

GET index36/_analyze
{
  "text": ["walking", "walked", "walk", "walks"],
  "analyzer": "my_analyzer"
}

结果

{
  "tokens" : [
    {
      "token" : "walk",
      "start_offset" : 0,
      "end_offset" : 7,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "walk",
      "start_offset" : 8,
      "end_offset" : 14,
      "type" : "word",
      "position" : 101
    },
    {
      "token" : "walk",
      "start_offset" : 15,
      "end_offset" : 19,
      "type" : "word",
      "position" : 202
    },
    {
      "token" : "walk",
      "start_offset" : 20,
      "end_offset" : 25,
      "type" : "word",
      "position" : 303
    }
  ]
}

所有四个词都产生相同的标记“walk”。所以这些词中的任何一个都会在搜索中匹配另一个。


推荐阅读