ElasticSearch:如何将关键字Map到子字段中的离散值?

kkbh8khc  于 12个月前  发布在  ElasticSearch
关注(0)|答案(1)|浏览(148)

我有一个索引,其中包含一个表示评级的关键字字段:A,A+,.我想把这些值Map到一个子字段中作为整数,以便对它应用衰减函数。范例:

rating: A
rating.value: 1

我只是想在这里检查一下,根据我的要求,什么是最聪明的方法。据我所知,这可以做到,

感谢您的帮助

yvfmudvl

yvfmudvl1#

谢谢你提出了一个经过充分研究的问题。事实上,在许多情况下,这些都是可行的解决办法。但是,在您的情况下,分析器方法将生成一个文本值,这需要在运行时进行转换。管道将向源添加一个额外的字段,这可能需要也可能不需要(浪费空间,但可能会加速重新索引)。
还有一个选项是将其实现为runtime field
但我最喜欢的可能是通过Map中的脚本生成它:

PUT test
{
  "mappings": {
    "properties": {
      "rating": {
        "type": "keyword"
      },
      "rating_value": {
        "type": "long",
        "script": """
            def ratings = ['F', 'E', 'D', 'C-', 'C', 'C+', 'C++', 'B-', 'B', 'B+', 'B++', 'A-', 'A', 'A+', 'A++'];
            emit(ratings.indexOf(doc['rating'].value))
         """
      }
    }
  }
}

PUT test/_bulk?refresh
{"index": {}}
{"rating": "D"}
{"index": {}}
{"rating": "A++"}
{"index": {}}
{"rating": "B"}
{"index": {}}
{"rating": "B-"}
{"index": {}}
{"rating": "who knows"}

GET test/_search
{
  "sort": [
    {
      "rating_value": {
        "order": "desc"
      }
    }
  ]
}

相关问题