Использование solr graph для обхода N взаимосвязей

#graph #solr #stream

#График #solr #поток

Вопрос:

Я изучаю, могу ли я использовать существующее хранилище solr для обхода графика. Было бы идеально не дублировать данные в хранилище графиков. Я играл с возможностями потоковой передачи solr и источником узлов (gatherNodes). У меня с этим три проблемы, и мне интересно, нашли ли люди решения:

1) получение исходных документов, на которые ссылаются узлы со всеми их полями. В конечном итоге я решил это, выполнив innerJoin для узлов, возвращаемых gatherNodes, и запрос к «*: *», но это кажется не идеальным. Есть ли лучший способ сделать это? Еще лучше было бы, если бы я мог сделать это как «экспорт», а не «выбор», чтобы лучше обрабатывать большие объемы данных. Эта проблема невелика по сравнению с двумя другими, которые кажутся серьезными ошибками в Solr

2) Я не могу перейти к узлам из поля, которое имеет более одного значения. В определении источника потока узлов есть параметр обхода.

 nodes(collection,
search(some search params)
walk="ref->id",
gather="vals")
  

в этом примере он переходит к результатам поиска, беря поле «ref» в этих документах и находя все узлы, которые соответствуют этому идентификатору. Это работает до тех пор, пока ref не станет списком значений. Кто-нибудь добился успеха в этой работе? Простым примером может служить древовидная структура, в которой у вас есть документ папки, и в нем есть многозначное поле, представляющее его вложенные папки и файлы. Как бы я обошел эти взаимосвязи?

3) в этом примере сбор возвращает узлы, которые представлены полем «vals» на всех узлах, которые являются результатом обхода. Это также не работает, если это поле многозначное. Кто-нибудь добился успеха и с этим? Снова возвращаясь к примеру с файлами и папками, я хочу вернуть все файлы во вложенные папки выбранной папки.

 nodes(collection,
search(collection, q="path:currentFolder", qt="/select", sort="fileId ASC"),
walk="contents->fileId",
gather="contents",
fq="type:file")
  

Я сделал это так, что могут быть некоторые опечатки, но предпосылка заключается в том, что содержимое представляет собой многозначное строковое поле, и каждый документ любого типа «file» или «folder» имеет fileId, на который ссылается поле содержимого. Как бы мне этого добиться? Нужно ли особым образом индексировать эти поля?

Также я понимаю, что, вероятно, есть другие способы выполнить этот запрос с помощью solr. Это всего лишь пример использования обхода графа.

Спасибо! Я действительно испытываю трудности. Примеров по этому поводу не так много, хотя он существует со времен solr 6.0.

Комментарии:

1. Что интересно, я вижу в документации solr, что он поддерживает многозначный обход, но только если это жестко закодированное значение nodes(emails, walk="johndoe@apache.org, janesmith@apache.org->from", gather="to") но при использовании другого потока в качестве входных данных функции nodes он не может разрешить поля, которые являются многозначными. Он даже не может правильно разрешить текстовые поля, которые имитируют приведенный выше пример. Если я сохраню поле с именем refs со значением ref-1, ref-2, ref-3, единственное совпадение будет в ref-1, когда walk=»refs-> id»

2. Я настоятельно рекомендую задать этот вопрос в списке рассылки solr-user, поскольку Джоэл Бернштейн (автор), вероятно, лучший человек, способный подробно ответить на эти вопросы — функциональность перехода по графу все еще довольно новая. Хотя могут быть разговоры о функции из предыдущих версий Lucene Solr Revolutions или Activate этого года, поэтому ознакомьтесь с ними, чтобы узнать, обсуждают ли они это (насколько я помню, Джоэл обычно присутствовал).

3. Также я думаю, что select вызов — это просто именование в потоковом выражении, /export обработчик все еще используется за кулисами — вы должны быть в состоянии подтвердить это, просмотрев журналы.

4. Спасибо, я тоже попробую это. и если я получу ответ где-нибудь еще, я опубликую его здесь. У меня такое чувство, что это просто не поддерживается. Есть задача jira, похожая на эту:'(

5. вы нашли ответ?