我在elasticsearch有一个索引“product”,我想添加一些标签,如“environmental”,“energy-saving”,“recyclable”,“medical-grade”到项目。我收集了一些谷歌后的方法:数组,嵌套,位。
1.使用数组。
{
"mappings": {
"properties": {
"tags": {
"type": "keyword"
}
}
}
}
它可以直接存储标签的名称。包含'environmental'和'medical-grade'的查询:
{
"query": {
"bool": {
"must": {
"terms": {
"tags": [
"environmental",
"medical-grade"
]
}
}
}
}
}
2.使用嵌套。
{
"mappings": {
"properties": {
"tags": {
"type": "nested",
"properties": {
"code": {
"type": "text"
}
}
}
}
}
}
它可以直接存储标签的名称,甚至id或其他。
包含“环境”和“医疗级”的查询:
{
"query": {
"bool": {
"must": {
"terms": {
"tags.name": [
"environmental",
"medical-grade"
]
}
}
}
}
}
3.使用钻头。
{
"mappings": {
"properties": {
"tags": {
"type": "long"
}
}
}
}
它可以间接地存储标签,并且需要指定一个位作为标签。
假设第n位代表第n个标签(二进制):0-〉“环境”,1-〉“节能”,2-〉“可回收”,3-〉“医疗级”,那么1001(二进制,十进制等于9)意味着它包含“环境”和“医疗级”。
包含“环境”和“医疗级”的查询:
{
"query": {
"bool": {
"must": {
"script": {
"script": "doc['tags'].size() != 0 && (doc['tags'].value&9)==9"
}
}
}
}
}
我不知道他们的表现如何,但我喜欢第三种方式,请给予我一些建议或更好的方式。
1条答案
按热度按时间7rtdyuoh1#
我的建议是使用选项1和数组。它将更容易查询数据,也用于聚合。
选项2,你可以使用,但我不认为这是最好的情况下,因为你没有嵌套或家长子女的数据,所以它是没有必要存储为嵌套。
选项3,我不建议,因为您需要在查询时使用脚本,这将影响性能。