Solr JOIN запрос - PullRequest
       11

Solr JOIN запрос

1 голос
/ 14 апреля 2010

Мне нужно выполнить запрос JOIN для индекса Solr. У меня есть два xmls, которые я проиндексировал, person.xml и subject.xml.

лицо:

<doc>
<field name="id">P39126</field>
<field name="family">Smith</field>
<field name="given">John</field>
<field name="subject">S1276</field>
<field name="subject">S1312</field>
</doc>

Тема:

<doc>
<field name="id">S1276</field>
<field name="topic">Abnormalities, Human</field>
</doc>

Мне нужно отображать информацию только от человека, но каждый запрос должен соответствовать полям как человека, так и темы. В случае, если запрос соответствует только теме документа, мне нужно отобразить все документы от человека, который имеет соответствующий идентификатор. Можно ли обойтись без выполнения двух отдельных запросов? Что-то вроде запроса JOIN сделало бы эту работу.

Любая помощь?

Ответы [ 3 ]

3 голосов
/ 14 апреля 2010

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

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

Для вашей проблемы может быть полезна схема, подобная этой:

<doc>
 <field name="id">P39126</field>
 <field name="family">Smith</field>
 <field name="given">John</field>
 <field name="topic">Abnormalities, Human</field> <!-- subject S1276 -->
 <field name="topic">some, other, topics</field> <!-- subject S1312 -->
</doc>

Выполнение запроса по некоторым темам с этой схемой вернет всех, у кого есть эти темы.

Некоторые ссылки, которые могут вас заинтересовать:

2 голосов
/ 05 января 2011

Кажется, хорошая реализация Join может появиться в ближайшее время: https://issues.apache.org/jira/secure/attachment/12465770/SOLR-2272.patch

0 голосов
/ 17 апреля 2010

Если вы не можете денормализовать, как это предлагает Паскаль, вы можете написать свой собственный обработчик запросов для объединения: сначала выполните запрос по запрошенным темам, который запрашивает поле идентификатора соответствующих документов, а затем выполните BooleanQuery, содержащий одно предложение. для каждого идентификатора (TermQuery для subject = id). Это будет иметь довольно низкую производительность, если есть большое количество идентификаторов, но должно быть хорошо, если есть только несколько совпадающих идентификаторов.

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

Я не знаю самый элегантный способ выдачи запроса из обработчика, но FWIW, вот как я это делаю.

Map args = new HashMap();
// add your query parameters to the map, like fields to return
args.put("fl", new String[]{"id"});
final SolrIndexSearcher searcher = req.getSearcher();
String query = "your query"
LocalSolrQueryRequest newReq = new LocalSolrQueryRequest(core, query, "", 0, 0, args) {
  @Override public SolrIndexSearcher getSearcher() { return searcher; }
  @Override public void close() { }
};
SolrQueryResponse newRsp = new SolrQueryResponse();
core.execute(core.getRequestHandler(newReq.getParams().get(CommonParams.QT)), newReq, newRsp);
// query results will be in newRsp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...