义词、关键字和语言分析器不能协同工作。
我有以下设置:
POST index1
{
"settings": {
"analysis": {
"filter": {
"english_keywords": {
"keywords": [
""
],
"type": "keyword_marker"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
},
"english_stop": {
"type": "stop",
"stopwords": [
"_english_"
]
},
"synonyms": {
"ignore_case": "true",
"type": "synonym",
"synonyms": ["Foo,Fruits=>Apples"],
"tokenizer": "keyword"
},
"english_possessive_stemmer": {
"type": "stemmer",
"language": "possessive_english"
}
},
"analyzer": {
"english_synonyms": {
"filter": [
"lowercase",
"asciifolding",
"english_stop",
"english_keywords",
"english_stemmer",
"english_possessive_stemmer",
"synonyms"
],
"type": "custom",
"tokenizer": "keyword"
}
}
}
},
"mappings": {
"myType": {
"properties": {
"name": {
"type": "string",
"analyzer": "english_synonyms"
}
}
}
}
}
POST index1/myType
{
"name": "Apples"
}
因此,您可能已经知道问题是什么,当分析apples
转向 appl
,这将导致match
查询无法正常工作。
请参阅_analyze
API 的以下结果。
GET index1/_analyze?field=name&text=fruits
{
"tokens": [
{
"token": "fruit",
"start_offset": 0,
"end_offset": 6,
"type": "word",
"position": 0
}
]
}
GET index1/_analyze?field=name&text=apples
{
"tokens": [
{
"token": "appl",
"start_offset": 0,
"end_offset": 6,
"type": "word",
"position": 0
}
]
}
GET index1/_analyze?field=name&text=foo
{
"tokens": [
{
"token": "apples",
"start_offset": 0,
"end_offset": 3,
"type": "SYNONYM",
"position": 0
}
]
}
知道如何解决这个问题的任何想法?
这很有趣,但是当我写问题时,我想出了解决方案。
问题是,Elasticsearch显然对文本一个接一个地运行过滤器,从第一个开始,直到最后一个。所以我所做的只是改变过滤器的顺序。
所以这个:
"analyzer":{
"english_synonyms":{
"filter":[
"lowercase",
"asciifolding",
"english_stop",
"english_keywords",
"english_stemmer",
"english_possessive_stemmer",
"synonyms"
],
"type":"custom",
"tokenizer":"keyword"
}
}
变成了这个:
"analyzer":{
"english_synonyms":{
"filter":[
"lowercase",
"asciifolding",
"synonyms",
"english_stop",
"english_keywords",
"english_stemmer",
"english_possessive_stemmer"
],
"type":"custom",
"tokenizer":"keyword"
}
}
我希望这对任何遇到这种情况的人都有帮助。
有一个很棒的工具叫做elyzer,您可以使用它来可视化您的代币在分析过程的每个步骤中的外观。这通常有助于发现问题。
以下是使用原始设置分析fruits
时的输出:
$ elyzer --es localhost:9200 --index test --analyzer english_synonyms --text fruits
TOKENIZER: keyword
{0:fruits}
TOKEN_FILTER: lowercase
{0:fruits}
TOKEN_FILTER: asciifolding
{0:fruits}
TOKEN_FILTER: english_stop
{0:fruits}
TOKEN_FILTER: english_keywords
{0:fruits}
TOKEN_FILTER: english_stemmer
{0:fruit}
TOKEN_FILTER: english_possessive_stemmer
{0:fruit}
TOKEN_FILTER: synonyms
{0:fruit}
以下是在列表中向上移动synonyms
令牌筛选器后分析fruits
时的输出:
$ elyzer --es localhost:9200 --index test --analyzer english_synonyms --text fruits
TOKENIZER: keyword
{0:fruits}
TOKEN_FILTER: lowercase
{0:fruits}
TOKEN_FILTER: asciifolding
{0:fruits}
TOKEN_FILTER: synonyms
{0:apples}
TOKEN_FILTER: english_stop
{0:apples}
TOKEN_FILTER: english_keywords
{0:apples}
TOKEN_FILTER: english_stemmer
{0:appl}
TOKEN_FILTER: english_possessive_stemmer
{0:appl}