我在我们的查询中添加了英语词干分析器和过滤器,但它似乎无法正确处理源自 'y' => 'ies' 的复数。 例如,当我搜索“覆盆子”时,结果永远不会包含“覆盆子”等。 我已经尝试了 english 和minimal_english 但我仍然得到相同的结果。
这是分析仪和设置:
analysis: {
analyzer: {
custom_analyzer: {
type: "custom",
tokenizer: "standard",
filter: ["lowercase", "english_stemmer"],
},
},
filter: {
english_stemmer: {
type: "stemmer",
language: "english",
},
},
},
}
我做错了什么?
虽然
english
应该适用于例如你提到,你甚至可以选择 porter_stem 来代替。这相当于语言为英语的词干分析器。
porter_stem 的实际应用:
POST /_analyze
{
"tokenizer": "standard",
"filter": ["porter_stem"],
"text": ["raspberry", "raspberries"]
}
上述要求的回应:
{
"tokens" : [
{
"token" : "raspberri",
"start_offset" : 0,
"end_offset" : 9,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "raspberri",
"start_offset" : 10,
"end_offset" : 21,
"type" : "<ALPHANUM>",
"position" : 101
}
]
}
您可以看到
raspberry
和 raspberries
都被标记为 raspberri
。因此,搜索 raspberry
也将匹配 raspberries
,反之亦然。
确保您要索引和搜索的字段已将分析器定义为
custom_analyzer
(根据您在问题中所述的设置)。
映射:
PUT test
{
"settings": {
"analysis": {
"analyzer": {
"custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"english_stemmer"
]
}
},
"filter": {
"english_stemmer": {
"type": "stemmer",
"language": "english"
}
}
}
},
"mappings": {
"properties": {
"field1": {
"type": "text",
"analyzer": "custom_analyzer"
}
}
}
}
索引:
PUT test/_doc/1
{
"field1": "raspberries"
}
PUT test/_doc/2
{
"field1": "raspberry"
}
搜索:
GET test/_search
{
"query": {
"match": {
"field1": {
"query": "raspberry"
}
}
}
}
回复:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.18232156,
"hits" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.18232156,
"_source" : {
"field1" : "raspberries"
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.18232156,
"_source" : {
"field1" : "raspberry"
}
}
]
}
}
您还可以看看其他词干分析器kstem。
不幸的是,porter_stem并不总是有效,例如病毒和病毒。有人建议滚雪球 - 但我还没尝试过...