SOLR: eDisMax с вложенными документами
У нас есть индекс электронных книг, который содержит метаданные электронной книги и каждой страницы в виде одного документа:
- Книга 1
- Страница 1
- Страница 2
- Страница 3
- ...
- Страница n
Родительский документ содержит поле is_parent:true
, id
а также doc_id
, Для родительских документов id
совпадает с doc_id, для дочерних документов id
является {doc_id}_{page_number}
, doc_id
всегда одинаково для родителя и его детей (именно так мы узнаем, какой ребенок принадлежит какому из родителей).
Поэтому теперь задача состоит в том, чтобы предложить полнотекстовый поиск, который использует eDisMax, чтобы найти наилучший результат для критерия поиска из метаданных родителей и контента детей и объединить их в значение оценки.
Текущий запрос выглядит так:
'fl' => 'id,doc_id,main_type,title,subtitle,publishing_date,page_number,author,score',
'defType' => 'edismax',
'stopwords' => 'true',
'mm' => '1',
'qf' => 'id^10.0 title^50.0 subtitle^40.0 author^20.0',
'q' => 'TEST _query_:"{!parent which=is_parent:true score=Max}{!dismax qf='content' v='TEST'}"^20',
'sort' => 'score DESC'
Но, похоже, оценка _query_
не добавляется к оценке основного запроса. Кроме того, если я сделаю это без термина "TEST" в начале: 'q' => '_query_:"{!parent which=is_parent:true score=Max}{!dismax qf='content' v='TEST'}"^20',
Я получаю значение балла - так что как-то счет есть, но я не уверен, как правильно его использовать.
Есть ли другой вариант для выполнения вложенного поиска с комбинированными оценками?
Прежде чем встать вопрос, почему мы не использовали функцию вложенных документов SOLR: мы создали этот индекс несколько лет назад, используя SOLR 4.6, и этой функции в то время не существовало. Теперь мы использовали инструменты IndexUpdater из SOLR 5 и SOLR 6, чтобы обновить наш индекс до SOLR 6.
В прошлом мы не могли создать наш полнотекстовый поиск, потому что функция SOLR BlockJoin вообще не поддерживала вычисление баллов, но в SOLR 5 это изменилось, поэтому мы хотим попробовать еще раз. Каждый намек в правильном направлении будет полезным.