使用 Elasticsearch 进行查询时遇到问题

Trouble making a query with Elasticsearch

伙计们,我希望你们在这个流行病时期过得很好,我在 elasticsearch 的查询中遇到忽略特殊字符的问题: 这是我想要做的:

Select * from table where ext like %6500% and start_time like %-01-% 

这是我所做的:

   "query": {
       "bool": {
           "must": [
               {
                   "query_string": {
                       "ext": "*6500*",
                       "fields": [
                           "extension"
                       ],
                       "analyze_wildcard": true
                   }
               },
               {
                   "query_string": {
                       "query": "*\-01\-*",
                       "fields": [
                           "start_time"
                       ],
                       "analyze_wildcard": true
                   }
               }
           ]
       }
   }

第一个有效,但第二个不符合我的要求。顺便说一下,字段 start_time 是这样的,例如:2020-01-03 15:03:45 并且它是一个关键词类型(我发现它是这样的)。

如果您被迫在您的 start_time 中使用 keyword 类型,则以下工作 - 不需要前导和尾随通配符,因为您的 start_time 将遵守某种格式:

GET karim/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "-01-",
            "fields": [
              "start_time"
            ]
          }
        }
      ]
    }
  }
}

不过,建议在处理日期(时间)时使用 date。所以像这样设置你的索引:

PUT karim
{
  "mappings": {
    "properties": {
      "start_time": {
        "type": "date",
        "format": "YYYY-MM-DD HH:mm:ss"
      }
    }
  }
}

并像这样查询

GET karim/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "start_time": {
              "gte": "01",
              "lt": "02",
              "format": "MM"
            }
          }
        }
      ]
    }
  }
}

任何给定年份的一月份。调整格式以匹配特定年份等

这种方法保证比通配符文本查询更快,尤其是。当您查询多个范围并且可能打算在路上聚合时。

您正在使用文本类型和关键字类型的子字段为您的字段编制索引。文本字段在标记中被破坏,例如“2020-01-12”将存储为 [“2020”,“01”,“12”]。您需要使用 "start_time.keyword"

运行 您对关键字字段的查询
{
  "query": {
       "bool": {
           "must": [
               {
                   "query_string": {
                       "query": "*-01-*",
                       "fields": [
                           "start_time.keyword" --> note
                       ],
                       "analyze_wildcard": true
                   }
               }
           ]
       }
   }
}

正如@joe 提到的通配符查询性能不佳,最好使用日期字段