Могу ли я указать Elasticsearch, чтобы придать определенному полю больший импульс?

#elasticsearch #full-text-search

#elasticsearch #полнотекстовый поиск

Вопрос:

Я использую простой поиск в Elasticsearch, но я хотел бы увеличить значение определенного URL-адреса, чтобы он отображался первым в результатах поиска. Я не уверен, возможно ли это?

Вот мое отображение.

                 "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 них был первым в результатах поиска. Возможно ли это вообще в Elasticsearch? В противном случае мне пришлось бы получать все и фильтровать в коде вместо этого.

Ответ №1:

Вы можете добавить should предложение, которое автоматически повысит любые совпадающие результаты (убедитесь url , что установлено значение type: string и index: 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
            }
          }
        }
      ]
    }
  }
}
  

Ответ №2:

У вас может быть запрос регулярных выражений в предложении should с высоким повышением. Попробуйте выполнить следующий запрос

 {
  "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
          }
        }
      ]
    }
  }
}