Elastic.co/Elastic search — обратная связь по релевантности с помощью нескольких запросов Boosting

Я пытаюсь реализовать обратную связь по релевантности для Elastic Search (Elastic.co).

Мне известно об ускорении запросов, которые позволяют задавать положительные и отрицательные термины, при этом идея состоит в том, чтобы сбрасывать со счетов негативные термины, не исключая их, как это было бы в случае логического значения must_not.

Однако я пытаюсь добиться многоуровневого повышения как положительных, так и отрицательных терминов.

То есть я хочу взять список объединенных положительных и отрицательных условий и сгенерировать запрос таким образом, чтобы были разные положительные и отрицательные уровни усиления, каждый из которых содержал свои собственные условия запроса.

что-то вроде (псевдозапрос):

query{
 {
 terms: [very relevant terms]
 pos_boost: 3
 }
 {
 terms: [relevant terms]
 pos_boost: 2
 }
 {
 terms: [irrelevant terms]
 neg_boost: 0.6
 }
 {
 terms: [very irrelevant terms]
 neg_boost: 0.3
}
}

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

Меня беспокоит то, что я не уверен, дает ли повышение значения 0,2 в предложении should логического запроса документу положительное увеличение оценки или нет, так как я хочу дисконтировать документ, а не обеспечить какое-либо увеличение счета.

При повышении запросов проблема заключается в том, что я не могу контролировать степень взвешивания положительных терминов.

Будем очень признательны за любую помощь или предложения по другим реализациям. (Что я действительно хотел сделать, так это создать языковую модель для релевантных документов и использовать ее для ранжирования, но я не понимаю, как это может быть легко достигнуто в эластичности.)


person smck1    schedule 12.08.2015    source источник


Ответы (3)


Кажется, вы можете комбинировать bool запрос и использовать условия повышения запроса настройка значений повышения.

POST so/boost/ {"text": "apple computers"}
POST so/boost/ {"text": "apple pie recipe"}
POST so/boost/ {"text": "apple tree garden"}
POST so/boost/ {"text": "apple iphone"}
POST so/boost/ {"text": "apple company"}

GET so/boost/_search
{
 "query": {
   "bool": {
     "must": [
       {
         "match": {
           "text": "apple"
         }
       }
     ], 
     "should": [
       {
         "match": {
           "text": {
             "query": "pie",
             "boost": 2
           }
         }
       },
       {
         "match": {
           "text": {
             "query": "tree",
             "boost": 2
           }
         }
       },
       {
         "match": {
           "text": {
             "query": "iphone",
             "boost": -0.5
           }
         }
       }
     ]
   }
 } 
} 
person Slam    schedule 12.08.2015
comment
Потрясающе, спасибо. Я не знал, что отрицательные повышения возможны (я где-то читал, что они должны быть >0). Я проверил это через валидатор, и он не жалуется, так что я попробую! - person smck1; 14.08.2015

В качестве альтернативы, если вы хотите закодировать свою языковую модель в свою коллекцию во время индексации, вы можете попробовать подход, описанный здесь: Elasticsearch: оценка влияния с помощью пользовательского поля оценки в документе

person Peter Dixon-Moses    schedule 13.08.2015
comment
Ага! Так что есть способ сделать это. Я думаю, что поиграю с этим, чтобы расширить ответ на повышающий запрос. Спасибо! - person smck1; 14.08.2015

Чтобы повысить эластичный поисковый документ (поисковый запрос на основе приоритета) на основе пользовательского/переменного значения повышения во время запроса, т. е. условного повышения.

Пример Java-кодирования:

customerKeySearch = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery(keys.type",  "xxx"));
customerTypeSearch = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("keys.keyValues.value", "xxxx"));                     
keyValueQuery = QueryBuilders.boolQuery().must(customerKeySearch).must(customerTypeSearch).boost(2f);

customerKeySearch = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery(keys.type",  "xxx"));
customerTypeSearch = QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("keys.keyValues.value", "xxxx"));                     
keyValueQuery = QueryBuilders.boolQuery().must(customerKeySearch).must(customerTypeSearch).boost(6f);

Описание и поисковый запрос:

В эластичном поиске есть свой внутренний метод расчета оценок, поэтому нам нужно отключить этот механизм, установив для свойства disableCoord(true) значение true в java, чтобы BoleanQuery применял пользовательский эффект усиления.

Следующий логический запрос выполняет запрос для повышения документов в индексе эластичного поиска на основе значения повышения.

 {
  "bool" : {
    "should" : [ {
      "bool" : {
        "must" : [ {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.type" : "XXX"
              }
            }
          }
        }, {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.keyValues.value" : "XXXX"
              }
            }
          }
        } ],
        "boost" : 2.0
      }
    }, {
      "bool" : {
        "must" : [ {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.type" : "XXX"
              }
            }
          }
        }, {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.keyValues.value" : "500072388315"
              }
            }
          }
        } ],
        "boost" : 6.0
      }
    }, {
      "bool" : {
        "must" : [ {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.type" : "XXX"
              }
            }
          }
        }, {
          "constant_score" : {
            "query" : {
              "term" : {
                "keys.keyValues.value" : "XXXXXX"
              }
            }
          }
        } ],
        "boost" : 10.0
      }
    } ],
    "disable_coord" : true
  }
}
person Alim Shaikh    schedule 27.01.2017