问题描述
我试图理解为什么下面的Elasticsearch查询不起作用。
编辑:
查询中提到的字段来自不同的索引。例如,过滤器的分类字段与查询字符串中提到的字段的索引不同。
过滤器查询的期望是,当用户专门在分类字段(即秘密或受保护的)上进行搜索时,将显示这些值。否则,如果用户从其他索引中搜索任何其他字段,例如名字或人,则不应考虑应用了任何过滤器,因为名字或人不属于该过滤器
{
"query": {
"bool": {
"filter": {
"terms": {
"classification": [
"secret","protected"
]
}
},"must": {
"query_string": {
"query": "*john*","fields": [
"classification","firstname","releasability","person"
]
}
}
}
}
}
返回的预期结果是现场人员中的john。当上面的代码中未应用任何过滤器时,此方法有效
{
"query": {
"query_string": {
"query": "*john*","person"
]
}
}
}
过滤器的目的仅是当所述字段包含提到的值时过滤记录,否则它应适用于所有值。
解决方法
添加带有示例索引数据和搜索查询的工作示例。
要了解有关布尔查询的更多信息,请参阅此官方documentation
索引数据:
my_index
索引中的索引数据
{
"name":"John","title":"b"
}
{
"name":"Johns","title":"a"
}
my_index1
索引中的索引数据
{
"classification":"protected"
}
{
"classification":"secret"
}
搜索查询:
POST http://localhost:9200/_search
{
"query": {
"bool": {
"should": [
{
"bool": {
"filter": [
{
"terms": {
"classification": [
"secret","protected"
]
}
}
]
}
},{
"bool": {
"must": [
{
"query_string": {
"query": "*john*","fields": [
"name","title"
]
}
}
]
}
}
]
}
}
}
搜索结果:
"hits": [
{
"_index": "my_index","_type": "_doc","_id": "1","_score": 1.0,"_source": {
"name": "John","title": "b"
}
},{
"_index": "my_index","_id": "2","_source": {
"name": "Johns","title": "a"
}
},{
"_index": "my_index1","_score": 0.0,"_source": {
"classification": "secret"
}
},"_source": {
"classification": "protected"
}
}
]