2016-06-21 2 views
1

Я пытаюсь выполнить поиск с пользовательскими функциями, чтобы изменить оценку документа. У меня есть отображение с специальностями, хранящихся в больнице и каждый специальность имеет приоритет с ним: Что-то вроде:Elikesearch пользовательские функции оценка

hospital:{ 
    name: 'Fortis', 
    specialities: [ 
    { 
    name: 'Cardiology', 
    priority: 10 
    }, 
    { 
    name: 'Oncology', 
    priority: 15 
    } 
] 
} 

Теперь у меня есть функция оценка:

functions: [{ 
    filter: {terms: {'specialities.name' => params[:search_text]}}, 
    script_score: {script: "_score * doc['specialities.priority'].value"} 
         }, 

У меня есть запрос фильтра чтобы соответствовать поисковому тексту любой специальности. Как если бы я искал Oncology, он будет соответствовать, и тогда я определил script_score, чтобы перенять эту специальность и добавить ее к окончательной оценке документа.

Но оно принимает приоритет первой специальности он сталкивается, что это 10 и 1 балл для фильтра согласованного и конец Счета 11 не 21 (приоритет онкология +-для соответствия фильтра)

ответ

1

Я решил его использовать вложенное отображение в поиске elastics. Lucene внутренне не имеет понятия хранения объектов отображения по умолчанию, так что если я ищу, чтобы сохранить приоритет для каждой специальности я должен иметь отображение как это:

hospital: { 
    properties: { 
    specialities: { 
     type: nested, 
     properties: { 
     name: { 
      type: 'string' 
     }priority: { 
      type: 'long' 
     } 
     } 
    } 
    } 
} 

Ссылка: https://www.elastic.co/guide/en/elasticsearch/reference/2.0/nested.html

После этого я был способен определить счет функции с вложенным запросом, и мой запрос выглядит так:

"query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "nested": { 
       "path": "specialities", 
       "query": { 
        "function_score": { 
        "score_mode": "sum", 
        "boost_mode": "sum", 
        "filter": { 
         "terms": { 
         "specialities.name.raw": ["Oncology"] 
         } 
        }, 
        "functions": [ 
         { 
         "field_value_factor": { 
          "field": "specialities.priority" 
         } 
         } 
        ] 
        } 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    }