假設我有以下順序的 Elasticsearch 索引:
index-2022-04
index-2022-05
index-2022-06
...
index-2022-04表示存盤在 2022 年 4 月index-2022-05的資料,表示存盤在 2022 年 5 月的資料,以此類推。現在假設在我的查詢有效負載中,我有以下時間戳范圍:
"range": {
"timestampRange": {
"gte": "2022-04-05T01:00:00.708363",
"lte": "2022-06-06T23:00:00.373772"
}
}
上述范圍表示我要查詢 4 ??月 5 日至 5 月 6 日之間存在的資料。這意味著我必須查詢三個索引中的資料index-2022-04,index-2022-05和index-2022-06。是否有一種簡單有效的方法可以跨這三個索引執行此查詢,而不必逐個查詢每個索引?
我正在使用 Python 來處理查詢,并且我知道我可以同時查詢不同的索引(請參閱此 SO 帖子)。任何提示或指示都會有所幫助,謝謝。
uj5u.com熱心網友回復:
您只需要在索引上定義一個別名并查詢別名而不是索引,然后讓 ES 找出它需要訪問哪些底層索引。
最后,為了提高搜索性能,您還可以在 上配置索引時間排序timestampRange,這樣如果您的別名跨越一整年的索引,ES 知道根據您查詢中的范圍約束只訪問其中三個(2022-04- 05 -> 2022 年 4 月 5 日)。
uj5u.com熱心網友回復:
就像您寫的那樣,您可以簡單地使用通配符和/或將串列作為目標索引傳遞。
最簡單的方法是使用星號通配符(例如index-*或index-2022-*)作為目標查詢所有索引。您不需要為此定義別名,只需在目標字串中使用通配符,如下所示:
from elasticsearch import Elasticsearch
es_client = Elasticsearch('https://elastic.host:9200')
datestring_start = '2022-04-05T01:00:00.708363'
datestring_end = '2022-06-06T23:00:00.373772'
result = es_client.search(
index = 'index-*',
query = { "bool": {
"must": [{
"range": {
"timestampRange": {
"gte": datestring_start,
"lte": datestring_end
}
}
}]
}
})
這將查詢與模式匹配的所有索引,但我希望 Elasticsearch 對此執行某種優化。正如@Val 在他的回答中所寫,配置索引時間排序將有利于性能,因為它限制了在索引排序和搜索排序相同時應該訪問的檔案數量。
為了完整起見,如果您真的只想將相關的索引名稱傳遞給 Elasticsearch,另一種選擇是首先在 Python 端找出您需要查詢的索引序列并將它們作為逗號分隔的串列提供(例如['index-2022-04', 'index-2022-05', 'index-2022-06'])作為目標。例如,您可以使用 Pandasdate_range()函式輕松生成這樣的索引串列,如下所示
from elasticsearch import Elasticsearch
import pandas as pd
es_client = Elasticsearch('https://elastic.host:9200')
datestring_start = '2022-04-05T01:00:00.708363'
datestring_end = '2022-06-06T23:00:00.373772'
months_list = pd.date_range(pd.to_datetime(datestring_start).to_period('M').to_timestamp(), datestring_end, freq='MS').strftime("index-%Y-%m").tolist()
result = es_client.search(
index = months_list,
query = { "bool": {
"must": [{
"range": {
"timestampRange": {
"gte": datestring_start,
"lte": datestring_end
}
}
}]
}
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/463960.html
