原創 ElasticSearch 分頁重複的問題

2021-10-10 04:41:35 字數 2442 閱讀 5853

相關環境

elasticsearch 6.7.0

python 3.7

python elasticsearch library 7.9.0

問題描述

當使用 elasticsearch 進行分頁取數時,出現了跨頁資料重複的問題。

問題原因

這是由於 es 的分片儲存與分片檢索機制導致的資料重複,具體可參與下面資訊。

解決方法

參考 stackoverflow 上面的方法解決了此問題

**片斷:

res = es.search(index=index,

doc_type=doc_type,

body=query,

search_type="dfs_query_then_fetch",

scroll="5m",

preference="_primary_first"

)

注:

elasticsearch 中的 _primary_first 引數從 6.1 版本以後過時了,7.0 版本之後則會移除,可以使用 _only_nodes 或者 _prefer_nodes 引數代替。

/users/jiangzhuolin/pycharmprojects/es_demo/venv/lib/python3.7/site-packages/elasticsearch/connection/base.py:190: elasticsearchdeprecationwarning: [_primary_first] has been deprecated in 6.1+, and will be removed in 7.0; use [_only_nodes] or [_prefer_nodes]

warnings.warn(message, category=elasticsearchdeprecationwarning)

附錄完整**示例:

# -*- coding:utf-8 -*-

from elasticsearch import elasticsearch

# es cluster domain

domain = 「jiangzl.tpddns.cn」

# es index name

test_index = 『test_index』

# es type name

test_type = 『test_type』

query = },

「size」: 100

# elasticsearch cluster hosts list

hosts = [「%s:9201/」 % domain, 「%s:9202/」 % domain, 「%s:9203/」 % domain]

# creating elasticsearch connection object

es = elasticsearch(hosts=hosts,

sniffer_timeout=60,

timeout=5,

retry_on_timeout=true,

max_retries=5

def _scroll_search_v1(index, doc_type, query):

res = es.search(index=index,

doc_type=doc_type,

body=query,

search_type=」dfs_query_then_fetch」,

scroll=」5m」,

preference=」_primary_first」

return res

if __name__ == 『__main__』:

# 模擬 15 頁的請求

for pageno in range(1, 16):

scroll_res = _scroll_search_v1(test_index, test_type, query)

hits = scroll_res.get(『hits』)

page = 1

while page < pageno and hits.get(「hits」):

page += 1

# 使用 scroll 來滾動獲取

scroll_res = es.scroll()

hits = scroll_res.get(『hits』)

for hit in hits.get(『hits』):

print(「page:\t%s\tid:\t%s」 % (pageno, hit[『_source』][『id』]))

相關參考:

談談那些偽原創的事 崇尚原創拒絕偽原創

內容為王,這句話相比每乙個站長都知道,但是很多人知道,卻做不到,我看到最多 的是偽原創,有的站長甚至直接用軟體採集,這就是典型的明知山有虎偏向虎山行,最終給你乙個重重的懲罰,才會長記性。第一種就是僥倖心理,在他們心理,想著不會那麼巧,抓住自己,然而事實上,蜘蛛幾乎每一秒都在監視著你的 很多時候,我們...

elasticsearch配置詳解

elasticsearch的config資料夾裡面有兩個配置檔案 elasticsearch.yml和logging.yml,第乙個是es的基本配置檔案,第二個是日誌配置檔案,es也是使用log4j來記錄日誌的,所以logging.yml裡的設定按普通log4j配置檔案來設定就行了。下面主要講解下e...

誰在使用Elasticsearch

github github使用elasticsearch搜尋20tb的資料,包括13億的檔案和1300億行的 這個不用介紹了吧,碼農們都懂的,github在2013年1月公升級了他們的 搜尋,由solr轉為elasticsearch,目前集群規模為26個索引儲存節點和8個客戶端節點 負責處理搜尋請求...