如何在具有属性层次结构的DSL查询中增加权重

问题描述

以下是Elasticsearch中的样本数据

   PUT /data/test/1
 {
       "id": "Accounting 101","room": "E3","professor": {
           "name": "Thomas Baszo","email": "baszot@onuni.com"
           },"students_enrolled": 27,"course_description": " financial statements"
   }
   
   PUT /data/test/2
   {
       "name": "Accounting 101","professor": {
           "name": "Sachin Baszo","course_description": "Thomas  Thomas Thomas Thomas "
   }

   PUT /data/test/3
   {
       "name": "Accounting 101","email": "Thomas@onuni.com"
           },"course_description": "nothing"
   }

下面是查询

GET /_search
{
  "query": {
    "query_string": {
      "query": "(*Thomas*)"
    }
  }
}

我的输出将第二个文档显示为第一个文档,因为它在描述中包含“ Thomas” 4次

  • 我需要为professor.name赋予更大的权重,它应该首先显示是否检查,然后再检查“ professor.email”,然后检查其他属性

1,3,2可能是1,是因为姓名,3是因为电子邮件,2是因为描述

Python

es.search(index="data",body={"query": {"query_string": {"query": "(*Thomas*)"}}})

解决方法

添加包含索引数据,搜索查询和搜索结果的工作示例

在创建索引时,boost也可以应用于各个字段,如previous answer

中所述

索引数据:

{
    "id": "Accounting 101","room": "E3","professor": {
        "name": "Thomas Baszo","email": "baszot@onuni.com"
    },"students_enrolled": 27,"course_description": " financial statements"
}
{
    "name": "Accounting 101","professor": {
        "name": "Sachin Baszo","course_description": "Thomas  Thomas Thomas Thomas "
}
{
    "name": "Accounting 101","professor": {
        "name": "Baszo","email": "Thomas@onuni.com"
    },"course_description": "Nothing"
}

搜索查询:

{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query": "Thomas","fields": [
            "professor.name^16","professor.email^8","course_description^4"
          ]
        }
      },"boost_mode": "multiply"
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "stof_63933144","_type": "_doc","_id": "1","_score": 14.506382,"_source": {
          "id": "Accounting 101","professor": {
            "name": "Thomas Baszo","email": "baszot@onuni.com"
          },"course_description": " financial statements"
        }
      },{
        "_index": "stof_63933144","_id": "3","_score": 7.846633,"_source": {
          "name": "Accounting 101","professor": {
            "name": "Baszo","email": "Thomas@onuni.com"
          },"course_description": "Nothing"
        }
      },"_id": "2","_score": 5.9089565,"professor": {
            "name": "Sachin Baszo","course_description": "Thomas  Thomas Thomas Thomas "
        }
      }
    ]

更新1:

要同时搜索Thomas OR Sachin和bor,可以使用以下查询:

{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query": "Thomas Sachin","course_description^4"
          ],"operator": "OR","type": "cross_fields"
        }
      },"boost_mode": "multiply"
    }
  }
}