gpt4 book ai didi

python - Elasticsearch 查询日期范围不起作用

转载 作者:行者123 更新时间:2023-12-02 22:10:57 26 4
gpt4 key购买 nike

我正在尝试查询 ElasticSearch 以获得两个时间戳之间的结果。
一个典型的记录看起来像

{
"_index": "cost-2018.08.09",
"_type": "log",
"_id": "asdasdasxsa-sdsds",
"_score": 4.281278,
"_source": {
"index": "cost-2018.08.09",
"app_group": "shop",
"timestamp": "2018-08-09T00:00:04.349692"
}
}

我用来检索每个 shop 的查询来自 app_group 2个时间戳之间:
GET /cost-2018.08.09/_search?q=app_group:shop 
{
"query": {
"range": {
"timestamp": {
"gte": "2018-08-09 04:00:04",
"lt": "2018-08-09 04:30:06"
}
}
}

仅每 shop 返回一次,但不检查任何 timestamp .奇怪的是,即使我故意在查询中包含错误:
GET /cost-2018.08.09/_search?q=app_group:shop
{
"query": {
"range": {
"timestamp": {
"gte": "2018-08-asdadsx09 04:00:04",
"lt": "2018-08-09asdasd 04:30:06"
}
}
}

我得到了完全相同的答案。喜欢它不走 query考虑在内。

一些注意事项:
在 Python 中,我的代码如下所示:
result = es_client.search(index='cost-2018.07.26', q='app_group:shop', filter_path=['hits.hits._source'], body={
"query": {
"range": {
"timestamp": {
"gte": "2018-08-09 04:00:04",
"lt": "2018-08-09 04:30:06"
}
}
}
})
timestamp记录的字段确实被解释为 date而不是 String .

我想念什么?

最佳答案

(请注意,此答案是 对于 Elasticsearch 6.3 )

对我有用的是 adding a mapping when creating the index.

在映射中,您指定您的字段将保存哪种数据,如果是日期 you can also set a format .

{
"mappings":{
"_doc":{
"timestamp": {
"format": "yyyy-MM-dd'T'HH:mm:ss'Z'",
"type": "date"
},
}
}
}

在这个例子中,格式是针对我的一个特定用例, but you can set it up however you need .

这应该允许您进行日期范围查询,如下例所示:
{
"query": {
"bool": {
"must": [
{
"match": {
"app_group": "shop"
}
}
],
"filter": [
{
"range" : {
"timestamp" : {
"gte": "2018-08-15T00:00:00Z",
"lte": "2018-08-15T23:00:00Z"
}
}
}
]
}
}
}

请注意,我使用的格式与您的略有不同。

更多细节:

在我的特殊情况下,我遇到了结果问题,因为我需要与搜索词完全匹配,以避免相关但不相关的结果。

在您的情况下,您似乎也可能遇到此问题,因为您正在搜索特定的“app_group”。

要启用精确搜索,您可以使用以下映射:
{
"settings":{
"index":{
"analysis":{
"analyzer":{
"analyzer_case_insensitive":{
"tokenizer":"keyword",
"filter":"lowercase"
}
}
}
}
},
"mappings":{
"_doc":{
"properties":{
"app_group":{
"type":"string",
"analyzer":"analyzer_case_insensitive"
}
}
}
}
}

(我在这个 very useful blog post 中发现的,在 StackOverflow 和其他地方遇到了几个过时的方法之后)

基本上提供的设置所做的是告诉索引器 use the keyword tokenizer并申请 the lowercase filter以便您的搜索不区分大小写(即首先将所有内容转换为小写,因此您可以搜索“app_group = shop”或“app_group = Shop”等。

最终映射应与此类似(除了您自己的日期格式):
{
"settings":{
"index":{
"analysis":{
"analyzer":{
"analyzer_case_insensitive":{
"tokenizer":"keyword",
"filter":"lowercase"
}
}
}
}
},

"mappings": {
"_doc": {
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy-MM-dd'T'HH:mm:ss'Z'"
},
"app_group": {
"type":"text",
"analyzer":"analyzer_case_insensitive"
}
}
}
}
}

关于python - Elasticsearch 查询日期范围不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51765849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com