Как правило, моя стратегия заключается в том, чтобы использовать фильтр синонима, чтобы не расширять поиск, чтобы включить все возможные синонимы, но для нормализации к одной форме. Я делаю это как в моем анализе полей индекса и запроса.
Например, с этой линией в моем fieldType/analyzer
блоке в schema.xml
:
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
(Обратите внимание на expand="false"
)
... и эту строку в моей synonyms.txt
:
spiderman, spider man, Mary Jane => peter
Таким образом, Я убеждаюсь, что любое из этих четырех значений будет проиндексировано и, как «peter». Например, если в исходном документе упоминается «The Amazing Spider Man», он будет индексироваться как «The Amazing peter». Когда пользователь ищет «Мэри Джейн», он будет искать «peter» вместо этого, поэтому будет соответствовать.
Важно то, что поскольку «Мэри» не является синонимом, разделенным запятыми, он не будет изменен, если он появится без «Джейн». Поэтому поиск «Мэри потрясающий» на самом деле будет искать «Мэри удивительна», и она не будет соответствовать документу.
Одна из важных деталей заключается в том, что я выбираю нормированную форму (например, «peter»), которая является только одним словом. Я мог бы организовать это так:
peter, spiderman, spider man => Mary Jane
, но потому, что Мэри Джейн два слова, он может (в зависимости от других особенностей моего поиска), соответствуют два слова отдельно, а также вместе. Выбирая единую форму слова для нормализации, я убеждаюсь, что мой токенизатор не попытается разбить его.
Просто хочу указать, что solr добавил лучшую поддержку для многосуточных синонимов. См. Https://lucidworks.com/2017/04/18/multi-word-synonyms-solr-adds-query-time-support/. – pwaterz