在朝鲜语中,城市名称可以附加后缀。
就像Newyorkcity
人们使用Newyork
或Newyorkcity
我想创建分析器(索引/搜索),以便当人们搜索newyork
或newyorkcity
时,我可以提供所有与纽约有关的文档。
我当时看着pattern
令牌生成器,并认为我可以使用
"tokenizer": ["whitespace", "my_pattern_tokenizer"]
但是,随后发现分析器中只能有一个标记器。
如何实现我想要的?
答案 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"
}
}
]
}
}
}