2015-06-14 2 views
1

Я только начал изучать elasticsearch. Мне нужно найти подход для определения пользовательских оценок на уровне поля. Например:Elasticsearch: пользовательские оценки на уровне поля в текстовых запросах

У меня есть коллекция имени блог, чьи документы имеют следующий формат:

{ 
    "_id": "1736hst26672829", 
    "name": "Learning regular expressions basics", 
    "author": "John Lee", 
    "summery": "Here is summery.", 
    "body": "Content of the blog." 
} 

Если я искать текст «хуг» в коллекции, то результат должен отражать следующие критерии бигованных

  • совпадение в поле «имя» имеет приоритет 1.
  • совпадение в поле автора имеет 2-й приоритет.
  • матч в летописе имеет 3-й приоритет.
  • матч в теле имеет наименее приоритетный характер.

Мне нужны лучшие 10 результатов на основе вышеуказанных критериев.

:

+0

Можете ли вы поделиться подход вы взяли здесь? – oblivion

ответ

2

набранное в ElasticSearch чрезвычайно настраиваемый, применяется следующее для запроса времени на основе пользовательского скоринга. Существуют различные другие параметры подсчета очков, по индексу, в вашем сопоставлении (и, следовательно, применяются к каждому запросу), по фильтрам или граням, с использованием ускорений или пользовательского скоринга.

В то время как пользовательский запрос оценки, как правило, является самым мощным решением, здесь представлены документы для различных пользовательских методов подсчета очков для чтения.

Следующая, вероятно, самые простые методы, чтобы применить пользовательский счет во времени запроса, хотя я предлагаю вам прочитать на заказ Score запроса.

"query": { 
     "filtered": { 
      "query": 
       "bool": { 
        "must": [ 
        {"multi_match": { 
           "fields": [ 
            "name^4", 
            "author^3", 
            "summery^2", 
            "body^1" 
           ], 
           "query": "xyz", 
           "operator": "AND", 
           "type": "cross_fields", 
           "analyzer": "standard" 
         }} 
        ] 
       } 
      } 
     } 
    } 

Для людей, которые ищут этот ответ, но хотят использовать NEST, это тот же запрос, что и NEST. Используйте символ ^, чтобы увеличить определенные поля или использовать OnFieldsWithBoost, чтобы дать собственные баллы, и запрос сортируется по результату.

var query = "xyz"; 

//Add your field names to a string in lower camelCase as is ES default. 
List<string> searchIn = new List<string(new string[] {"_id","name","author","summery","body"}); 

.Type("blogType") 
.SortDescending("_score") 
.Query(
    q => q.MultiMatch(
     t => t.OnFields(
      searchIn 
      .Select(qs => qs == "name" ? "name^4" : qs) 
      .Select(qs => qs == "author" ? "author^3" : qs) 
      .Select(qs => qs == "summery" ? "summery^2" : qs) 
      .Select(qs => qs == "body" ? "body" : qs) 
      ) 
     .Query(query) 
    ) 
) 

Если у вас есть правильное отображение (по умолчанию) в ES (C# объекта для ES индексируется JSON объект), вы также можете использовать следующие в пределах OnFields:

t => t.OnFieldsWithBoost(qs => qs.Add(entry => entry.Name, 4.0) 
          .Add(entry => entry.Author, 3.0) 
          .Add(entry => entry.Summary, 2.0) 
          .Add(entry => entry.Body, 1.0)) 
+1

(+1) для вашего объяснения. У меня есть сценарий, где у меня есть «много полей (более 30)», и мне нужно иметь «наивысший приоритет» на 'field1' и' field2', а остальные оставшиеся поля имеют «нижний и равный приоритет». Итак, есть ли какой-то способ, я мог бы предоставить поля с более высоким приоритетом только в запросе вместо того, чтобы хранить все поля в запросе, как показано в вашем примере запроса? – oblivion

Смежные вопросы