在_all上使用全文搜索时,如何为特定字段名称评分Elasticsearch匹配?

时间:2016-05-13 17:29:09

标签: elasticsearch

我设置了一个索引,它有许多表示用户数据的类型,例如ShoppingList,Playlist等。每种类型都有一个“identity_id”字段,用于表示用户的唯一标识符。我使用以下查询来搜索用户的所有类型和字段(对于网站中的搜索功能):

GET _search
{
  "query": {
    "filtered": {
      "query": {
        "match_phrase_prefix": {
          "_all": "awesome"
        }
      },
      "filter": {
        "match": {
          "identity_id": 1
        }
      }
    }
  }
}

我的问题是:

  1. 有没有办法在字段名称中包含“name”的字段上给匹配更高的分数?例如,ShoppingList类型将具有shopping_list_name字段,并且我希望其匹配高于其他字段。
  2. 上述方式是对特定用户进行全文搜索(查询然后过滤)最有效的方法吗?那么为每个用户创建一个索引呢?

1 个答案:

答案 0 :(得分:1)

这个提升某些字段的查询怎么样:

{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query": "awesome",
          "fields": [
            "*_name",
            "field*"
          ]
        }
      },
      "functions": [
        {
          "weight": 2,
          "filter": {
            "multi_match": {
              "query": "awesome",
              "fields": [
                "*_name"
              ]
            }
          }
        },
        {
          "weight": 1,
          "filter": {
            "multi_match": {
              "query": "awesome",
              "fields": [
                "field*"
              ]
            }
          }
        }
      ]
    }
  }
}

上述查询的作用是提升(weigth: 2*_name字段查询,而不是对名为field*的字段应用任何提升。

  

上述方式是对特定用户进行全文搜索(查询然后过滤)最有效的方法吗?那么为每个用户创建一个索引呢?

关于这个问题,这个问题更复杂,你还需要考虑你拥有多少用户,集群拥有的硬件资源,数据结构,使用的查询等。