Elasticsearch 查询过滤器组合问题
Elasticsearch query filter combination issue
我试图理解为什么下面的 elasticsearch 查询不起作用。
编辑:
查询中提到的字段来自不同的索引。例如过滤器有分类字段,它与查询字符串中提到的字段位于不同的索引中。
过滤器查询的预期是,当用户专门搜索分类字段(即机密或受保护)时,将显示值。否则,如果用户从不同的索引中搜索任何其他字段,例如 firstname 或 person,则不应考虑应用任何过滤器,因为 firstname 或 person 不是过滤器的一部分
{
"query": {
"bool": {
"filter": {
"terms": {
"classification": [
"secret",
"protected"
]
}
},
"must": {
"query_string": {
"query": "*john*",
"fields": [
"classification",
"firstname",
"releasability",
"person"
]
}
}
}
}
}
预期的结果是 john in the field person 返回。这在上面的代码中没有应用过滤器时有效
{
"query": {
"query_string": {
"query": "*john*",
"fields": [
"classification",
"firstname",
"releasability",
"person"
]
}
}
}
过滤器的目的只是在所述字段包含提到的值时过滤记录,否则它应该适用于所有值。
为什么它不生成 john 的结果而只生成分类值的结果?
添加带有示例索引数据和搜索查询的工作示例。
要了解有关 Bool 查询的更多信息,请参阅这位官方 documentation
索引数据:
my_index
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",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"name": "Johns",
"title": "a"
}
},
{
"_index": "my_index1",
"_type": "_doc",
"_id": "1",
"_score": 0.0,
"_source": {
"classification": "secret"
}
},
{
"_index": "my_index1",
"_type": "_doc",
"_id": "2",
"_score": 0.0,
"_source": {
"classification": "protected"
}
}
]
我试图理解为什么下面的 elasticsearch 查询不起作用。
编辑:
查询中提到的字段来自不同的索引。例如过滤器有分类字段,它与查询字符串中提到的字段位于不同的索引中。
过滤器查询的预期是,当用户专门搜索分类字段(即机密或受保护)时,将显示值。否则,如果用户从不同的索引中搜索任何其他字段,例如 firstname 或 person,则不应考虑应用任何过滤器,因为 firstname 或 person 不是过滤器的一部分
{
"query": {
"bool": {
"filter": {
"terms": {
"classification": [
"secret",
"protected"
]
}
},
"must": {
"query_string": {
"query": "*john*",
"fields": [
"classification",
"firstname",
"releasability",
"person"
]
}
}
}
}
}
预期的结果是 john in the field person 返回。这在上面的代码中没有应用过滤器时有效
{
"query": {
"query_string": {
"query": "*john*",
"fields": [
"classification",
"firstname",
"releasability",
"person"
]
}
}
}
过滤器的目的只是在所述字段包含提到的值时过滤记录,否则它应该适用于所有值。
为什么它不生成 john 的结果而只生成分类值的结果?
添加带有示例索引数据和搜索查询的工作示例。
要了解有关 Bool 查询的更多信息,请参阅这位官方 documentation
索引数据:
my_index
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",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"name": "Johns",
"title": "a"
}
},
{
"_index": "my_index1",
"_type": "_doc",
"_id": "1",
"_score": 0.0,
"_source": {
"classification": "secret"
}
},
{
"_index": "my_index1",
"_type": "_doc",
"_id": "2",
"_score": 0.0,
"_source": {
"classification": "protected"
}
}
]