使用 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 提到的通配符查询性能不佳,最好使用日期字段
伙计们,我希望你们在这个流行病时期过得很好,我在 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 提到的通配符查询性能不佳,最好使用日期字段