У меня есть индекс около 100 тыс. Документов, представляющих сущность фильма.
Пользователи могут помещать фильмы в различные списки (например, избранное и т. Д.)
Эти списки хранятся в базе данных mysql.и не индексируются в solr.
Я мог бы хранить идентификаторы пользователей в многозначных полях, представляющих список, но это очень плохо, потому что поля получались бы очень, очень длинными и индексация тоже была бы проблематичной.
Так что в настоящее время я делаю следующее (псевдокод):
$favorites = SELECT document_id FROM favorites WHERE user_id = $user_id
$documents = 'http://solr.com:8393/select/?q=XYZ&fq=document_id:('.join(' OR ',$favorites);
это работает отлично и быстро, но количество элементов в запросах фильтра ограничено 1024 (я пробовал это).также фильтр запросов сложить.поэтому, если у меня есть один фильтр-запрос с 500 значениями для фильтрации, у меня могут быть другие значения для 524 фильтров в другом поле.
Пока все нормально, потому что я ограничил количество записей в списке 1024, и это довольно много, ноЯ думаю, что этот подход очень неуклюжий и приводит к большим накладным расходам.
Разве нет лучшего решения?Как написать модуль Solr, который напрямую подключается к базе данных или что-то?Я хотел бы сделать это в php.
Если нет другого пути, могу ли я как-нибудь поднять предел 1024?потому что это работает очень быстро сейчас!Я думаю, что с хорошим оборудованием больше проблем не будет.
Редактировать: как указано в комментариях, я публикую свою исходную схему и рабочий пример запроса.
<field name="film_id" type="int" indexed="true" stored="true" required="true"/>
<field name="imdb_id" type="int" indexed="true" stored="true" />
<field name="parent_id" type="int" indexed="true" stored="true"/>
<field name="malus" type="int" indexed="true" stored="true"/>
<field name="type" type="int" indexed="true" stored="true"/>
<field name="year" type="int" indexed="true" stored="true" termVectors="true"/>
<field name="locale_title" type="string" indexed="false" stored="true"/>
<field name="aka_title" type="filmtitle" indexed="true" stored="true" multiValued="true" omitNorms="true" termVectors="true" />
<field name="sort_title" type="string" indexed="true" stored="true"/>
<field name="director" type="person" indexed="true" stored="true" multiValued="true" omitNorms="true"/>
<field name="director_phonetic" type="person_phonetic" multiValued="true" omitNorms="true"/>
<field name="actor" type="person" indexed="true" stored="true" multiValued="true" omitNorms="true"/>
<field name="actor_phonetic" type="person_phonetic" multiValued="true" omitNorms="true"/>
<field name="country" type="string" indexed="true" stored="true" multiValued="true"/>
<field name="description" type="text" indexed="true" stored="true" />
<field name="genre" type="genre" indexed="true" stored="true" multiValued="true" termVectors="true"/>
<field name="url" type="string" indexed="true" stored="true" multiValued="false"/>
<field name="image_url" type="string" indexed="false" stored="true" multiValued="false"/>
<field name="rating" type="int" indexed="true" stored="true" required="false" default="50"/>
<field name="affiliate" type="string" indexed="true" stored="true" multiValued="true"/>
<field name="product_type" type="string" indexed="true" stored="true" multiValued="true"/>
<dynamicField name="product_*" type="string" indexed="true" stored="true" multiValued="true"/>
<field name="blockbuster" type="boolean" indexed="true" stored="true" />
<copyField source="film_id" dest="id"/>
<field name="director_id" type="string" indexed="true" stored="true" multiValued="true" termVectors="true"/>
<field name="actor_id" type="string" indexed="true" stored="true" multiValued="true" termVectors="true"/>
вот моиВ дополнение к стандартному schema.xml
пример результатов поиска можно просмотреть здесь .
пример запроса:
http://my-server.com:8983/solr/select/?
q=description:nazis
&fq=product_bluray:amazon
&fq=film_id:(1185616 1054606 88763 361748 78748)
здесьпользователь будет искать фильмы, которые:
- доступны на Amazon в виде синего цвета
- , которые имеют термин "нацисты" в описании
- И которые включеныего список избранного
список включает фильмы (документы) с идентификаторами 1185616 1054606 88763 361748 78748 и хранится в базе данных mysql.
ps:Не знаю, правильно ли я сформулировал вопрос, надеюсь, это понятно.Если нет, пожалуйста, не стесняйтесь редактировать!