将标签存储到elasticsearch中的最佳方式是什么

u5i3ibmn  于 2022-12-03  发布在  ElasticSearch
关注(0)|答案(1)|浏览(287)

我在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"
                }
            }
        }
    }
}

我不知道他们的表现如何,但我喜欢第三种方式,请给予我一些建议或更好的方式。

7rtdyuoh

7rtdyuoh1#

我的建议是使用选项1和数组。它将更容易查询数据,也用于聚合。
选项2,你可以使用,但我不认为这是最好的情况下,因为你没有嵌套或家长子女的数据,所以它是没有必要存储为嵌套。
选项3,我不建议,因为您需要在查询时使用脚本,这将影响性能。

相关问题