问题描述
以下是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次
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"
}
}
}