与所有人一起提升前缀查询

时间:2014-12-16 01:28:09

标签: elasticsearch

我希望能够在任何字段中找到的每个搜索字词上加上查询前缀,我希望能够突出显示。我制定了一个似乎有用的查询。现在,我想更新查询,以便其中一个字段中的匹配产生的分数高于其他字段中的匹配。

例如,我索引以下数据(这只是一个示例,在我的实际数据中,还有更多的字段而不仅仅是两个):

PUT / my_index / my_type / abc124 {     "标题" :" blah",     "描述" :"高尔夫" }

PUT / my_index / my_type / abc123 {     "标题" :" blah golf",     "描述" :"当然" }

PUT / my_index / my_type / abc125 {     "标题" :" blah golf tee",     "描述" :"当然" }

然后我可以像查询一样查询:

POST my_index/my_type/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "prefix": {
                        "_all" : "gol"
                    }    
                },
                {
                    "prefix": {
                        "_all": "bla"
                    }
                }
            ]
        }
    },
      "highlight":{
    "fields":{
      "*":{}
    }
  }
}

产生结果:

{
   "took": 11,
   "timed_out": false,
   "_shards": {
      "total": 4,
      "successful": 4,
      "failed": 0
   },
   "hits": {
      "total": 3,
      "max_score": 1.4142135,
      "hits": [
         {
            "_index": "my_index",
            "_type": "my_type",
            "_id": "abc125",
            "_score": 1.4142135,
            "_source": {
               "title": "blah golf tee",
               "description": "course"
            },
            "highlight": {
               "title": [
                  "<em>blah</em> <em>golf</em> tee"
               ]
            }
         },
         {
            "_index": "my_index",
            "_type": "my_type",
            "_id": "abc124",
            "_score": 1.4142135,
            "_source": {
               "title": "blah",
               "description": "golf"
            },
            "highlight": {
               "description": [
                  "<em>golf</em>"
               ],
               "title": [
                  "<em>blah</em>"
               ]
            }
         },
         {
            "_index": "my_index",
            "_type": "my_type",
            "_id": "abc123",
            "_score": 1.4142135,
            "_source": {
               "title": "blah golf",
               "description": "course"
            },
            "highlight": {
               "title": [
                  "<em>blah</em> <em>golf</em>"
               ]
            }
         }
      ]
   }
}

如何使用function_score或其他方法修改评分,以便我可以在title字段上比其他字段得分更高?我是否需要将查询更改为多匹配而不是使用_all?任何建议将不胜感激。

此致 LT

1 个答案:

答案 0 :(得分:2)

尝试添加bool查询should部分,如果should中的任何语句匹配,则会对整个查询给出更高的分数(对于那些语句,这不是强制性的)匹配查询以返回结果)。

例如,试试这个:

POST my_index/my_type/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "_all": "gol"
          }
        },
        {
          "prefix": {
            "_all": "bla"
          }
        }
      ],
      "should": [
        {
          "prefix": {
            "title": {
              "value": "gol",
              "boost": 3
            }
          }
        },
        {
          "prefix": {
            "title": {
              "value": "bla",
              "boost": 3
            }
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "*": {}
    }
  }
}