【发布时间】:2020-04-16 18:54:32
【问题描述】:
我在 elastic 中的数据设置有不同的字段:类别、子类别、乐器和情绪。我的目标是只为传递给它的所有关键字提供完全匹配的结果,并且只返回与所有内容匹配的结果。到目前为止,这似乎一直有效,直到我使用由多个用空格分隔的单词组成的关键字,如下所示:
"query": {
"bool": {
"must": [
{
"match": {
"categories": "Electronic"
}
},
{
"match": {
"categories": "Pop"
}
},
{
"match": {
"instruments": "Female Vocal"
}
}
]
}
}
我在 ES 中的数据由这种类型的数据组成:
[name] => Some Data Name
[categories] => Electronic,Pop
[subcategories] => 1970s,Alternative,Experimental,Retro
[instruments] => Electronic Drums,Male Vocal,Synth
[moods] => Fun,Futuristic,Pulsing,Quirky,Rhythmic
因此,它与乐器字段的“人声”部分匹配,但不完全匹配“女声”。
这可能会通过 ES 过滤器解决吗?
编辑: 为了考虑其他字符,我稍微扩展了示例数据集:
[categories]=>R&B,Dance/House
[instruments] => Electronic Drums,Male Vocal,Synth
[moods] => Fun,Futuristic,Pulsing,Quirky,Rhythmic
因此,可能会使用与号、斜线和空格。逗号将分隔单独的术语。
已解决 我最终对分析器进行了更多研究,并意识到我可能需要创建一个自定义的分析器来说明我的关键字的边界。
myesurl/tracks/_settings
{
"index": {
"analysis": {
"tokenizer": {
"comma": {
"type": "pattern",
"pattern": ","
}
},
"analyzer": {
"tracks_analyzer": {
"type": "custom",
"tokenizer": "comma",
"filter": [
"trim",
"lowercase"
]
}
}
}
}
}
然后我设置一个映射:
{
"track": {
"properties": {
"categories": {
"type": "string",
"analyzer": "tracks_analyzer"
},
"subcategories": {
"type": "string",
"analyzer": "tracks_analyzer"
},
"instruments": {
"type": "string",
"analyzer": "tracks_analyzer"
},
"moods": {
"type": "string",
"analyzer": "tracks_analyzer"
}
}
}
}
然后将内容推送到elasticsearch中。似乎按预期工作。它现在考虑关键字中的任何字符,只要关键字与由分隔的逗号创建的标记匹配。
【问题讨论】:
标签: elasticsearch