在elasticsearch中使用function_score查詢

2021-03-02 開發Web那點事

好久沒有寫更新了,有灰!再次抱歉!!!前端時間一直在研究kubernets+.net core相關,本打算寫幾篇k8s的文章,但在公司聽到同事遇到個需求一直沒有搞定,於是出於程式設計師的本能了解了一下,就是需要根據左上角,右下角的經緯度坐標查詢一批在地圖上均勻分布!

一、先看語法

_search{   "query":{     "function_score":{       "query":{        "match_all":{}        },       "functions":[                 {           "gauss":{               "location":{                   "origin":{                       "lon":116.402688,                       "lat":39.91416                   },                   "offset":"5km",                   "scale":"10km"               }             }          }       ],       "boost_mode":"replace",        "score_mode":"sum",        "max_boost":10,        "min_score":1         "boost":5      }   }}

二、也支持僅帶一個函數的語法如

GET /_search{
"query": {
"function_score": {
"query": { "match_all": {} },
"boost": "5",
"random_score": {},
"boost_mode": "multiply"
}
}}

三、下面介紹下3種decay functions衰減函數

gauss:高斯函數則是鐘形的,他的衰減速率是先緩慢,然後變快,最後又放緩

linear:線性函數是條直線,一旦直線與橫軸0相交,所有其他值的評分都是0

exp:指數函數是先劇烈衰減然後變緩

具體效果圖參考官網:

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#function-decay

四、random_scoring隨機一致性函數,可以隨用戶而變,官方示例:

GET /_search{
"query": {
"function_score": {
"random_score": {
"seed": 10,
"field": "_id" //_seq_no文檔修改時會變,建議使用一個文檔的唯一值欄位
}
}
}}

五、field_value_factor函數,直接指定field有時可能太多生硬了,可以通過modifier和factor參數配合使結果更加柔和些,modifier可以有更多函數可用(log,log1p,log2p,ln,ln1p,ln2p,sqrt,square,none,reciprocal)

GET /_search{
"query": {
"function_score": {
"field_value_factor": {
"field": "my-int",
"factor": 1.2,
"modifier": "sqrt",
"missing": 1
}
}
}}

六、script_score 通過腳本(painless-默認、expression等)完全自定義控制評分計算,如官網直接使用文檔的值作為結果

GET /_search{
"query": {
"function_score": {
"query": {
"match": { "message": "elasticsearch" }
},
"script_score": {
"script": {
"source": "Math.log(2 + doc['my-int'].value)"
}
}
}
}}

七、最後我們看一個實戰案例,這個也是困擾我們公司很久的一個小問題,當然我們自己對elasticsearch的了解也很有限,場景是我們希望在地圖上通過小紅點的方式展示我們的門店,每個門店有經緯度位置,當地圖放大時查詢一批門店,在地圖上均勻分布,就這麼個需求!

來我們看看如何搞定它!就用到我們這裡的random_score函數,當然我這裡使用了script_fields計算距離以及根據距離排序,僅僅為了演示這種功能而已!

{    "size":15,    "_source":"*",     "sort":[     {       "_geo_distance":{           "location":[116.402688,39.91416],           "order":"asc",           "unit" : "km",           "ignore_unmapped": true       }     } ],  "script_fields":{     "distance":{         "script":{             "lang":"painless",             "source":"doc['location'].arcDistance(params.lat,params.lon) * 0.001",             "params":{                 "lon":116.402688,                 "lat":39.91416             }         }     } }, "query":{        "function_score":{            "query":{                "match_all":{}//這裡加上你自己的查詢條件            },            "functions":[{                "random_score":{                    "seed":10,                    "field":"_id"                }            }],            "boost_mode":"sum"        }    }}

相關焦點

  • Function score查詢的應用及源碼解析
    插入一些測試數據,PUT /blogs/_doc/2{ "content": "We like elasticsearch", "votes": 2}GET blogs/_search{ "query": { "match": { "content": "elasticsearch" } }}
  • 為什麼Elasticsearch查詢變得這麼慢了?
    (您可以設置為0s以分析實例並收集正在發送的所有查詢,並設置為-1以關閉慢速日誌。)使用您在_clustersettings中選擇使用的日誌級別設置。 在這個例子中,「DEBUG」。ES_PORT是一個持久的環境變量。
  • 全文搜尋引擎ElasticSearch入門教程
    $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip  $ unzip elasticsearch-5.5.1.zip  $ cd elasticsearch-5.5.1/  接著,進入解壓後的目錄,運行下面的命令,啟動 Elastic。
  • 最常用的Elasticseaerch查詢方法
    詳細信息可以在Elasticsearch指南中查詢Elasticsearch guide. 獲取。2、多欄位檢索 (Multi-field Search)如我們已經看到的,要在搜索中查詢多個文檔欄位(例如在標題和摘要中搜索相同的查詢字符串),請使用multi_match查詢。
  • 2021-Java後端工程師面試指南-(Elasticsearch)
    Restful實時搜索和分析引擎(實時)高擴展性,可擴展至上百臺伺服器,處理PB級結構化或非結構化數據Elasticsearch用於全文檢索,結構化搜索,分析/合併使用聊聊Elasticsearch的特性:Elasticsearch沒有典型意義的事務(無事務性)什麼是全文檢索和Lucene?
  • ElasticSearch
    • 映射(mapping) mapping定義了每個欄位的類型、欄位所使用的分詞器等。相當於關係型資料庫中的表結構。 • 文檔(document) Elasticsearch中的最小數據單元,常以json格式顯示。一個document相當於關係型資料庫中的一行數據。
  • Open Distro for Elasticsearch 1.1.0 發布,Elasticsearch 發行版
    Open Distro for Elasticsearch 是 AWS 開源的 Elasticsearch 發行版。可以 GitHub 存儲庫中的發行說明中找到有關增強、bug 修復和更多信息的詳細信息:https://github.com/opendistro-for-elasticsearch新特性此版本中提供一些新的插件,以便集成到開發者的應用程式中,雖然這些插件屬於 alpha 版本。
  • ElasticSearch 億級數據檢索案例實戰!
    提高索引與檢索的性能建議,可參考官方文檔https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexing-speed.html
  • Elasticsearch Analyzer
    Elasticsearch內置了40+種分詞過濾器,這裡不再一一贅述。3 Specify the analyzer for a text fieldmapping analyzer參數可以為特定欄位設定分析器。一旦設定完畢,那麼在index或search階段將會使用該分析器進行文本分析。
  • Elasticsearch高階使用方法有哪些?
    布爾組合查詢、範圍查詢…等多種高級查詢。以及非常重要的聚合查詢,其兩種常用類型:桶和度量的說明與使用。昨天學了match匹配和term匹配,這是兩種最基礎也很重要的查詢方式,使用起來也簡單。實際應用中用戶搜索時輸入的詞條與實際詞條存在偏差,但也能搜索到對應的數據,這就需要使用到模糊查詢了。
  • 讓Elasticsearch飛起來!百億級實時查詢優化實戰
    面對這樣一個數據量級的需求,我們的數據如何存儲和實現實時查詢將是一個嚴峻的挑戰。經過對 Elasticsearch 多方調研和超過幾百億條數據的插入和聚合查詢的驗證之後,我們總結出以下幾種能夠有效提升性能和解決這一問題的方案:本文所使用的 Elasticsearch 版本為 5.3.3。
  • 深入淺出 spring-data-elasticsearch 之 ElasticSearch 架構初探(一)
    類型(Type)類型,用於區分索引中的文檔,即在索引中對數據邏輯分區。比如索引 project 的項目數據,根據項目類型 ui 項目、插畫項目等進行區分。如圖:分片(Shard)分片,是 ES 節點中最小的工作單元。分片僅僅保存全部數據的一部分,分片的集合是 ES 的索引。分片包括主分片和副分片,主分片是副分片的拷貝。主分片和副分片地工作基本沒有大的區別。在索引中全文搜索,然後會查詢到每個分片,將每個分配的結果進行全局地收集處理,並返回。
  • 解決 Elastic Search 的深分頁問題
    Elastic Search 為了避免深分頁,不允許使用分頁(from + size)查詢 10000 條以後的數據,因此如果要查詢第 10000 條以後的數據,要使用 Elastic Search 提供的 scroll 遊標 來查詢1. 為什麼不能使用 from + size 進行深分頁查詢?
  • Hadoop 讀寫 Elasticsearch
    使用Hadoop操作Elasticsearch的方法,關鍵是指定InputFormatClass : EsInputFormat.classOutputFormatClass: EsOutputFormat.class,這個好像是ES官方提供的集成包。網上查了相關資料貌似挺少的。
  • ElasticSearch-hard插件及IK分詞器安裝
    當然有了:elasticSeard-head這個插件就可以實現這個功能。我們先來看看使用插件後的效果:ElasticSearch-head是什麼?ElasticSearch-head:是集群管理、數據可視化、增刪改查、查詢語句可視化工具。
  • elasticsearch 八、重要的配置更改
    集群名稱改成elasticsearch_production,這麼一個簡單的修改可以避免很多的痛心。Elasticseach by default starts a cluster named elasticsearch.
  • Elasticsearch實現原理分析
    在elasticsearch.yml中,將nodes.master屬性設置為true(默認),可以將節點配置為有資格成為主節點的節點。對於大型生產集群,建議擁有一個專用主節點來控制集群,並且不服務任何用戶請求。數據節點用來保存數據和倒排索引。默認情況下,每個節點都配置為一個data節點,並且在elasticsearch.yml中將屬性node.data設置為true。
  • 這篇實戰攻略,帶你輕鬆入門Elastic search
    什麼是Elasticsearch,為什麼要使用它?Elasticsearch 是一個分布式、RESTful 風格的搜索和數據分析引擎。它基於Lunece實現,使用java語言編寫。Lunece是一個優秀的搜尋引擎庫,但它使用起來非常複雜。
  • 如何使用Elasticsearch和cAdvisor監控Docker容器
    至少有一個獨立運行的 Elasticsearch 節點(版本號 2.4.X)。 重申一下,此 Elasticsearch 集群環境不能放在生產環境中使用。生產環境也不推薦使用單節點集群,所以如果你計劃安裝一個生產環境,請參考 Elastic 指南。
  • 《Elasticsearch 權威指南》中文版
    在幾十位社區同學的共同努力下,《Elasticsearch 權威指南》的翻譯工作接近尾聲,在線訪問連結如下: