假设我有以下映射:
{
'properties': {
{'title': {'type': 'text'},
{'created': {'type': 'text'}}
}
}
有时用户会按created
查询,有时按title
和created
查询。在这两种情况下,我都希望查询 JSON 尽可能相似。创建仅在用户不使用title
进行查询时仅按created
进行筛选的查询的好方法是什么?
我尝试了类似的东西:
{
bool: {
must: [
{range: {created: {gte: '2010-01-01'}}},
{query: {match_all: {}}}
]
}
}
但这没有用。编写此查询的最佳方法是什么?
您的查询不起作用,因为created
类型为text
而不是date
,字符串日期的范围查询将无法按预期工作,您应该将映射从类型text
更改为date
并重新索引您的数据。
按照此操作逐步为数据(使用新映射(重新编制索引。
现在,如果我理解正确,您想使用一个通用查询,该查询根据用户输入过滤title
或/和created
。
在这种情况下,我的建议是使用查询字符串。
示例(版本 7.4.x(:
映射
PUT my_index
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"created": { -------> change type to date instead of text
"type": "date"
}
}
}
}
为一些文档编制索引
PUT my_index/_doc/1
{
"title":"test1",
"created": "2010-01-01"
}
PUT my_index/_doc/2
{
"title":"test2",
"created": "2010-02-01"
}
PUT my_index/_doc/3
{
"title":"test3",
"created": "2010-03-01"
}
搜索查询(已创建(
GET my_index/_search
{
"query": {
"query_string": {
"query": "created:>=2010-02-01",
"fields" : ["created"]
}
}
}
结果
"hits" : [
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"title" : "test2",
"created" : "2010-02-01"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"title" : "test3",
"created" : "2010-03-01"
}
}]
搜索查询(标题(
GET my_index/_search
{
"query": {
"query_string": {
"query": "test2",
"fields" : ["title"]
}
}
}
结果
"hits" : [
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.9808292,
"_source" : {
"title" : "test2",
"created" : "2010-02-01"
}
}
]
搜索查询(标题和创建(
GET my_index/_search
{
"query": {
"query_string": {
"query": "(created:>=2010-02-01) AND test3"
}
}
}
结果
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.9808292,
"hits" : [
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.9808292,
"_source" : {
"title" : "test3",
"created" : "2010-03-01"
}
}
]
查询字符串中的字段- 您可以提及这两个字段。 如果删除fields
则查询将应用于映射中的所有字段。
希望这有帮助