我一直面临着多字段弹性搜索查询的一些问题。我正在尝试查询与名为func_name的字段匹配的所有文档到两个硬编码字符串,即使我的索引包含具有这两个函数名称的文档,但查询结果始终只获取一个func_name。到目前为止,我已尝试过以下查询。
1)以下只返回一个函数匹配,即使文档还有另一个函数
GET /_search
{
"query": {
"multi_match": {
"query": "FEM_DS_GetTunerStatusInfo MDM_TunerStatusPrint",
"operator": "OR",
"fields": [
"func_name"
]
}
}
}
2)下面断断续续地给我这两个功能。
GET /_search
{
"query": {
"match": {
"func_name": {
"query": "MDM_TunerStatusPrint FEM_DS_GetTunerStatusInfo",
"operator": "or"
}
}
}
}
3)以下只返回一个函数匹配,即使文档还有另一个函数
{
"query": {
"bool": {
"should": [
{ "match": { "func_name": "FEM_DS_GetTunerStatusInfo" }},
{ "match": { "func_name": "MDM_TunerStatusPrint" }}
]
}
}
}
非常感谢任何帮助。
感谢您的回复。让我们假设我的弹性搜索中有以下类型的文档。我希望我的搜索能够返回前两个文件,因为它们匹配我的func_name。
{
"_index": "diag-178999",
"_source": {
"severity": "MIL",
"t_id": "03468500",
"p_id": "000007c6",
"func_name": "MDM_TunerStatusPrint",
"timestamp": "2017-06-01T02:04:51.000Z"
}
},
{
"_index": "diag-344563",
"_source": {
"t_id": "03468500",
"p_id": "000007c6",
"func_name": "FEM_DS_GetTunerStatusInfo",
"timestamp": "2017-07-20T02:04:51.000Z"
}
},
{
"_index": "diag-101010",
"_source": {
"severity": "MIL",
"t_id": "03468500",
"p_id": "000007c6",
"func_name": "some_func",
"timestamp": "2017-09-15T02:04:51.000Z"
}
答案 0 :(得分:1)
请求您的ES的“两种最佳方式”是按特定字段的字词进行过滤或汇总您的查询,以便您可以重命名字段,应用多个规则,并为您的回复提供更易理解的格式
请参阅:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html,其他文档页面在这里,非常有用: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html
在你的情况下,你应该这样做:
{
"from" : 0, "size" : 2,
"query": {
"filter": {
"bool": {
"must": {
"term": {
"func_name" : "FEM_DS_GetTunerStatusInfo OR MDM_TunerStatusPrint",
}
}
}
}
}
}
OR
"aggs": {
"aggregationName": {
"terms": {
"func_name" : "FEM_DS_GetTunerStatusInfo OR MDM_TunerStatusPrint"
}
}
}
}
最后的聚合只是为了向您展示如何与查询过滤器做同样的事情。让我知道它是否正常工作:)
祝你好运
答案 1 :(得分:0)
据我了解,您应该使用过滤后的查询来匹配任何上面提到的func_name
值之一的文档:
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"terms": {
"func_name": [
"FEM_DS_GetTunerStatusInfo",
"MDM_TunerStatusPrint"
]
}
}
]
}
}
}
}
}
请参阅: Filtered Query,Temrs Query
ES 5.0中的更新:
{
"query": {
"bool": {
"must": [
{
"terms": {
"func_name": [
"FEM_DS_GetTunerStatusInfo",
"MDM_TunerStatusPrint"
]
}
}
]
}
}
}
请参阅:this answer