同义词,关键词和语言分析师不能一起工作。
我有以下设置:
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
}
]
}
如何解决这个问题?
答案 0 :(得分: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"
}
}
我希望这有助于任何遇到这种情况的人。
答案 1 :(得分:0)
这是一款名为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}
以下是在列表中移动fruits
令牌过滤器后分析synonyms
时的输出:
$ 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}