相關環境
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個客戶端節點 負責處理搜尋請求...