说我有以下映射:
{
'properties': {
{'title': {'type': 'text'},
{'created': {'type': 'text'}}
}
}
有时用户会通过created
进行查询,有时还会通过title
和created
进行查询。在这两种情况下,我都希望查询JSON尽可能相似。当用户不使用created
进行查询时,创建仅按title
进行过滤的查询的一种好方法是什么?
我尝试过类似的事情:
{
bool: {
must: [
{range: {created: {gte: '2010-01-01'}}},
{query: {match_all: {}}}
]
}
}
但是那没有用。编写此查询的最佳方法是什么?
答案 0 :(得分:2)
您的查询无效,原因是created
的类型为text
而不是date
,对字符串日期的范围查询无法按预期进行,您应该将映射更改为类型{ {1}}到text
并重新索引您的数据。
按照this逐步为您的数据建立索引(使用新的映射)。
现在,如果我理解正确,您想使用一个通用查询,该查询根据用户输入过滤date
或/和title
。
在这种情况下,我的建议是使用Query String。
一个示例(版本7.4.x):
映射
created
为一些文档建立索引
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"
}
}
]
,则该查询将应用于您映射中的所有字段。
希望这会有所帮助