Предположим, у меня есть тестовое приложение, представляющее список друзей. Приложение использует коллекцию, где все документы в следующем формате:Solr индексация коллекции MongoDB
_id : ObjectId("someString"),
name : "George",
description : "some text",
age : 35,
friends : {
[
{
name: "Peter",
age: 30
town: {
name_town: "Paris",
country: "France"
}
},
{
name: "Thomas",
age: 25
town: {
name_town: "Berlin",
country: "Germany"
}
}, ... // more friends
]
}
... // more documents
Как я могу описать такую коллекцию в schema.xml? Мне нужно создать фасетные вопросы, например: «Дайте мне страны, где живут друзья Джорджа». Другой вариант использования может быть: «Вернуть все документы (лица), чей друг 30 лет». и т.д.
Моя первоначальная идея заключается в том, чтобы отметить «друзья» атрибут как текстовое поле с помощью этой schema.xml определения:
<fieldType name="text_wslc" class="solr.TextField" positionIncrementGap="100">
....
<field name="friends" type="text_wslc" indexed="true" stored="true" />
и попытаться найти, например. слова «возраст» и «30» в тексте, но это не очень надежное решение.
Пожалуйста, оставьте в стороне не логически хорошо сформированную архитектуру коллекции. Это всего лишь пример аналогичной проблемы, с которой я столкнулся.
Любая помощь или идея будут высоко оценены.
EDIT: Sample 'schema.xml'
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="text-schema" version="1.5">
<types>
<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0" />
<fieldType name="trInt" class="solr.TrieIntField" precisionStep="0" omitNorms="true" />
<fieldType name="text_p" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.TrimFilterFactory"/>
<filter class="solr.WordDelimiterFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.TrimFilterFactory"/>
<filter class="solr.WordDelimiterFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
</types>
<fields>
<field name="_id" type="string" indexed="true" stored="true" required="true" />
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="_ts" type="long" indexed="true" stored="true"/>
<field name="ns" type="string" indexed="true" stored="true"/>
<field name="description" type="text_p" indexed="true" stored="true" />
<field name="name" type="text_p" indexed="true" stored="true" />
<field name="age" type="trInt" indexed="true" stored="true" />
<field name="friends" type="text_p" indexed="true" stored="true" /> <!-- Here is the problem - when the type is text_p, all fields are considered as a text; optimal solution would be something like "collection" tag to mark name_town and town as descendant of the field 'friends' but unfortunately, this is not how the solr works-->
<field name="town" type="text_p" indexed="true" stored="true"/>
<field name="name_town" type="string" indexed="true" stored="true"/>
<field name="town" type="string" indexed="true" stored="true"/>
</fields>
<uniqueKey>_id</uniqueKey>
Ну, если вы хотите придерживаться вашей идеи схемы, я не вижу решения для вашего требования. Вам понадобится функция соединения, так как вы хотите сделать что-то вроде вложенных объектов. Нет другого надежного способа запросить что-то вроде этого, не запуская апгрейд-ад. – cheffe