我刚开始使用弹性搜索。我已经正确设置了所有设置。我正在使用Firebase + Flashlight +弹性搜索。
在我的前端,我正在根据不同的搜索参数构建查询。我将它们插入Firebase /search/requests/
中的节点。手电筒会选择它并将响应放入/search/response
,这就像一个魅力!
但是,我不确定如何正确编写查询。当我尝试合并两个must
match
个查询时,我得到了奇怪的结果。我正在使用查询DSL。
我在deliverables/doc
下的弹性搜索中的文档具有以下方案。
...
{
"createdBy" : "admin@xx.org",
"createdOn" : 1501200000000,
"deadLine" : 1508716800000,
"description" : {
"value" : "dummy description"
},
"key" : "<FBKEY>",
"programmes" : [ {
"code" : "95000",
"name" : "Test programme",
"programYear" : 2017
} ],
"projects" : [ {
"projectCode" : "113200",
"projectName" : "Test project",
"projectYear" : 2017
} ],
"reportingYear" : 2017,
"status" : "Open",
"type" : "writing",
"updatedBy" : "admin@xx.org",
"updatedOn" : 1501200000000,
},
...
我的查询具有以下结构。
{
"query": {
"bool": {
"must": [
{
"match": {
"createdBy": "xx@company.org"
},
"match": {
"programmes.code": "95000"
}
}
]
}
}
}
在我的输出中,我还获得了那些没有这两个字段的文档?他们的得分也很低。这是正常的吗?
我的映射,使用Flashlight自动创建
更新1
我刚尝试了这个查询,但是由于没有对这两个字段进行过滤,它仍然给我带来了奇怪的结果:
{
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"match": {
"programmes.code": "890000"
}
},
{
"match": {
"createdBy": "admin@xx.org"
}
}
]
}
}
}
}
}
答案 0 :(得分:2)
must
中使用的bool query
子句在查询上下文中执行(所有文档按得分的降序返回)并有助于得分。 see link
如果您希望将其作为过滤器执行,请使用以下查询:
{
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"match": {
"createdBy": "xx@company.org"
}
},
{
"match": {
"programmes.code": "95000"
}
}
]
}
}
}
}
}
注意:强>
默认情况下,分析字符串字段,将字符串字段的映射更新为not_analyzed
,以使用filter
查询。请参阅:mapping-intro