我可以告诉Elasticsearch为特定领域提供更多提升吗?

时间:2016-10-05 13:01:07

标签: elasticsearch full-text-search

我在Elasticsearch中使用了一个简单的搜索,但我想给一个特定的网址一个提升,所以它会在搜索结果中首先出现。我不确定它是否可能?

这是我的映射。

                "hal": {
                    "properties": {
                        "label": {
                            "type": "string",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        }
                    }
                },
                "url": {
                    "type": "string",
                    "index": "not_analyzed"
                },

这是我的查询

{
    "fields": [ "url","brand"],
    "query": {
        "bool": {
            "must": [{
                "terms": {
                    "brand": ["brand"]
                }
            },{
                "terms": {
                    "hal.label.raw": ["donald trump"]

                }
            }]
        }
    }
}

现在,当我搜索时,我会得到至少500个结果。但是,url有一种特殊的模式,我想给它一个提升 http://www.anything.com/people/*所以url /people .replace(/([A-Z])/g, ' $1').trim()会出现在搜索结果中的第一位。这在Elasticsearch中甚至可以实现吗?否则我将不得不获取所有内容并在代码中过滤。

2 个答案:

答案 0 :(得分:0)

您可以添加should子句,该子句会自动提升所有匹配结果(确保url设置为type: stringindex: not_analyzed):

{
  "fields": [
    "url",
    "brand"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "brand": [
              "brand"
            ]
          }
        },
        {
          "terms": {
            "hal.label.raw": [
              "donald trump"
            ]
          }
        }
      ],
      "should": [
        {
          "wildcard": {
            "url": "http://www.anything.com/people/*"
          }
        }
      ]
    }
  }
}

您还可以指定特定的提升值:

{
  "fields": [
    "url",
    "brand"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "brand": [
              "brand"
            ]
          }
        },
        {
          "terms": {
            "hal.label.raw": [
              "donald trump"
            ]
          }
        }
      ],
      "should": [
        {
          "wildcard": {
            "url": {
              "value": "http://www.anything.com/people/*",
              "boost": 1
            }
          }
        }
      ]
    }
  }
}

答案 1 :(得分:0)

你可以在具有高增强的should子句中拥有regex query。请尝试以下查询

{
  "fields": [
    "url",
    "brand"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "brand": [
              "brand"
            ]
          }
        },
        {
          "terms": {
            "hal.label.raw": [
              "donald trump"
            ]
          }
        }
      ],
      "should": [
        {
          "regexp": {
            "url": "http://www.anything.com/people/.*",
            "boost" : 50
          }
        }
      ]
    }
  }
}