我在elasticsearch中有一个“产品”索引,我想在项目中添加一些标签,比如“环保”、“节能”、“可回收”、“医疗等级”。我在google之后收集了一些方法:数组,嵌套,位。
1.使用数组。
{
"mappings": {
"properties": {
"tags": {
"type": "keyword"
}
}
}
}它可以直接存储标签的名字。包含“环境”和“医疗等级”的查询:
{
"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.使用bit。
{
"mappings": {
"properties": {
"tags": {
"type": "long"
}
}
}
}它可以间接地存储标记,并且需要将位指定为标记。
假设n位表示n- tag(binary):0->'environmental',1->'energy-saving',2->'recyclable',3->'medical-grade'.So 1001(二进制数,等于小数点中的9)表示它包含“环境”和“医学等级”。
包含“环境”和“医疗等级”的查询:
{
"query": {
"bool": {
"must": {
"script": {
"script": "doc['tags'].size() != 0 && (doc['tags'].value&9)==9"
}
}
}
}
}我不知道他们的表现如何,但我喜欢第三条路actually.Please给我一些建议或更好的方式。
发布于 2022-11-29 10:35:05
我的建议是使用选项1并使用数组。它可以方便地查询数据,也可以用于聚合。
选项2,您可以使用,但我不认为这是最好的情况,因为您没有嵌套或paent子数据,所以没有必要存储为嵌套。
选项3,我不会建议您在查询时使用脚本,这会影响性能。
https://stackoverflow.com/questions/74612223
复制相似问题