如何在ElasticSearch中使用Query DSL查找最近的数字

aoyhnmkz  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(2)|浏览(181)

我正在寻找一种可能性,以找到最接近的价格/数字的帮助下,ElasticSearch。问题是,我没有一个范围。我想实现的是,结果排序的最近距离。根据示例搜索查询,我的索引包含3个文件与以下价格(数字):四十五、二十七、三十二
从我的搜索值29到给定数字的“距离”是45 - 29 = 16| 27 - 29 = -2| 32 - 29 = 3所以我所期望的是,搜索结果是按数字离给定价格的“距离”来评分的。
搜索查询示例:

GET myawesomeindex/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "description": "this is the text i want to find"
          }
        },
        {
          "match": {
            "price": 29
          }
        }
      ]
    }
  }
}

我想我的问题与这个类似的问题有关:Elasticsearch scoring based on how close a number is to a query

jexiocij

jexiocij1#

这就对了:

"sort": {
    "_script": {
      "type": "number",
      "script": "return doc['price'].value-distance",
      "params": {
        "distance": 29
      },
      "lang": "groovy",
      "order": "desc"
    }
  }

您还需要启用动态脚本。
你也可以这样做

"query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "description": "this is the text i want to find"
              }
            },
            {
              "match": {
                "price": 29
              }
            }
          ]
        }
      },
      "functions": [
        {
          "exp": {
            "price": {
              "origin": "29",
              "scale": "1",
              "decay": 0.999
            }
          }
        }
      ]
    }
  }

但是这将改变score本身。如果你想纯粹按距离排序(而不是其他),那么我相信第一种选择是最好的。

cnh2zyt3

cnh2zyt32#

以下是我的工作方式。在这个例子中,我使用了UTC秒的时间戳。

{
    "query": {
      "function_score": {
         "functions": [
            {
               "linear": {
                   "timestamp" : {
                        "origin": 1601227629,
                        "scale": "30m"
                   }
               }
            }
         ],
         "score_mode" : "multiply",
         "boost_mode": "multiply",
         "query": {
            "match_all": {}
         }
      }
   },
    "size": 1
}

相关问题