如何忽略弹性搜索中的撇号?
how to ignore apostrophes in elasticsearch?
如何在 elasticsearch 中忽略撇号?
假设我正在寻找一个字符串 Paul's
。我希望在发送诸如 pauls
或 paul's
.
之类的术语时能够匹配它
这是我的索引的配置方式:(我尝试使用自定义分析器执行此操作,但它不起作用):
{
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: 'standard',
filter: ['standard', 'lowercase', 'my_stemmer'],
},
},
filter: {
my_stemmer: {
type: 'stemmer',
name: 'possessive_english',
},
},
},
},
mappings: {
my_type: {
properties: {
description: { type: 'text' },
title: { type: 'text', analyzer: 'my_analyzer' },
},
},
}
在搜索方面,词干分析器无法帮助您 pauls
。为此,您真的需要忽略撇号 '
。下面我在 title
字段中添加了一个新的 sub-field,它使用 char_filter 来忽略撇号。但是在搜索本身中,您需要同时使用主字段 - title
- 和 sub-field - title.no_stemmer
:
DELETE test
PUT test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [
"standard",
"lowercase",
"my_stemmer"
]
},
"no_stemmer_analyzer": {
"tokenizer": "standard",
"filter": [
"standard",
"lowercase"
],
"char_filter": "my_char_filter"
}
},
"filter": {
"my_stemmer": {
"type": "stemmer",
"name": "possessive_english"
}
},
"char_filter": {
"my_char_filter": {
"type": "mapping",
"mappings": [
"'=>"
]
}
}
}
},
"mappings": {
"my_type": {
"properties": {
"description": {
"type": "text"
},
"title": {
"type": "text",
"analyzer": "my_analyzer",
"fields": {
"no_stemmer": {
"type": "text",
"analyzer": "no_stemmer_analyzer"
}
}
}
}
}
}
}
POST test/my_type/_bulk
{"index":{}}
{"title":"Paul's"}
{"index":{}}
{"title":"Paul"}
{"index":{}}
{"title":"Pauls"}
GET test/_search
{
"query": {
"multi_match": {
"fields": ["title", "title.no_stemmer"],
"query": "Paul's"
}
}
}
如何在 elasticsearch 中忽略撇号?
假设我正在寻找一个字符串 Paul's
。我希望在发送诸如 pauls
或 paul's
.
这是我的索引的配置方式:(我尝试使用自定义分析器执行此操作,但它不起作用):
{
settings: {
analysis: {
analyzer: {
my_analyzer: {
tokenizer: 'standard',
filter: ['standard', 'lowercase', 'my_stemmer'],
},
},
filter: {
my_stemmer: {
type: 'stemmer',
name: 'possessive_english',
},
},
},
},
mappings: {
my_type: {
properties: {
description: { type: 'text' },
title: { type: 'text', analyzer: 'my_analyzer' },
},
},
}
在搜索方面,词干分析器无法帮助您 pauls
。为此,您真的需要忽略撇号 '
。下面我在 title
字段中添加了一个新的 sub-field,它使用 char_filter 来忽略撇号。但是在搜索本身中,您需要同时使用主字段 - title
- 和 sub-field - title.no_stemmer
:
DELETE test
PUT test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [
"standard",
"lowercase",
"my_stemmer"
]
},
"no_stemmer_analyzer": {
"tokenizer": "standard",
"filter": [
"standard",
"lowercase"
],
"char_filter": "my_char_filter"
}
},
"filter": {
"my_stemmer": {
"type": "stemmer",
"name": "possessive_english"
}
},
"char_filter": {
"my_char_filter": {
"type": "mapping",
"mappings": [
"'=>"
]
}
}
}
},
"mappings": {
"my_type": {
"properties": {
"description": {
"type": "text"
},
"title": {
"type": "text",
"analyzer": "my_analyzer",
"fields": {
"no_stemmer": {
"type": "text",
"analyzer": "no_stemmer_analyzer"
}
}
}
}
}
}
}
POST test/my_type/_bulk
{"index":{}}
{"title":"Paul's"}
{"index":{}}
{"title":"Paul"}
{"index":{}}
{"title":"Pauls"}
GET test/_search
{
"query": {
"multi_match": {
"fields": ["title", "title.no_stemmer"],
"query": "Paul's"
}
}
}