【发布时间】:2022-11-29 19:23:58
【问题描述】:
我在elasticsearch中有一个索引'product',我想为item添加'environmental','energy-saving','recyclable','medical-grade'之类的标签。我在google之后收集了一些方法:array,nested,少量。
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.使用位。
{
"mappings": {
"properties": {
"tags": {
"type": "long"
}
}
}
}
它可以间接存储标签,需要指定一个位作为标签。
假设第n位代表第n个标签(二进制):0->'环保',1->'节能',2->'可回收',3->'医疗级'.So 1001(二进制,等于十进制的9)表示它包含'环境'和'医疗级'。
包含“环境”和“医疗级”的查询:
{ "query": { "bool": { "must": { "script": { "script": "doc['tags'].size() != 0 && (doc['tags'].value&9)==9" } } } } }我不知道他们的表现如何,但我实际上喜欢第三种方式。请给我一些建议或更好的方法。
【问题讨论】:
标签: elasticsearch tags