Elasticserarch如何在空白和特殊词上标记化

时间:2019-11-27 14:41:18

标签: elasticsearch

在朝鲜语中,城市名称可以附加后缀。

就像Newyorkcity

人们使用NewyorkNewyorkcity

我想创建分析器(索引/搜索),以便当人们搜索newyorknewyorkcity时,我可以提供所有与纽约有关的文档。

我当时看着pattern令牌生成器,并认为我可以使用

"tokenizer": ["whitespace", "my_pattern_tokenizer"]

但是,随后发现分析器中只能有一个标记器。

如何实现我想要的?

2 个答案:

答案 0 :(得分:1)

我不建议使用ngram_analyzer,因为结果可能不稳定,并且会导致大量数据冗余。

您的想法是正确的,这就是我的做法:

首先使用pattern char filter创建自定义分析器:

{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "type": 'custom',
                    "tokenizer": 'whitespace',
                    "filter": ['lowercase'],
                    "char_filter": ["my_char_replace"]
                }
            }
            "char_filter": {
                "my_city_char_filter": {
                    "type": "pattern_replace",
                    "pattern": "city",
                    "replacement": ""
                }
            }
        }
    }
}

在您的映射中:

"city": {
    "type": "keyword",
    'analyzer': "my_analyzer"
    }
}

现在,您只需使用以下命令即可查询您的数据:

GET index/_search
{
    "query": {
        "bool": {
            "match": {
               "city": query
            }       
        }
    }
}

答案 1 :(得分:0)

PUT index_name
{
  "mappings": {
    "_doc": {
        "properties": {
              "city": {
                "type": "text", "analyzer": "ngram_analyzer",
                "fields": {
                  "raw": {
                    "type": "keyword"
                  }
                }
              }
            }
        }
    },
    "settings": {
        "analysis": {
          "filter": {
          "ngram_tokenizer": {
            "token_chars": ["letter", "digit"],
            "min_gram": 3
            "max_gram": 20
          }
          },
          "analyzer": {
            "ngram_analyzer": {
              "tokenizer": "ngram_tokenizer"
            }
          }
        }
    }
}

搜索Newyork或Newyorkcity

GET index_name/_search
{
    "query": {
      "match": {
        "city": "Newyork"
      } 
    }
}

GET index_name/_search
{
    "query": {
      "bool": {
        "should": [
          { 
            "match": {
            "city": "Newyorkcity"
            }
          },
          { 
            "match": {
            "city.raw": "Newyorkcity"
            }
          }
        ]
      } 
    }
}