Как сделать частичное начало матчей в Solr? - PullRequest
5 голосов
/ 06 мая 2010

Я пытаюсь найти частичные начальные совпадения в большом списке фамилий. Итак, Вайн * должен найти Вайнберга, Вайнкамма и т. Д.

Я мог бы сделать это, создав специальное поле и добавив

<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" preserveOriginal="1"/>

к его спецификации типа в schema.xml. Когда я добавляю приведенную выше строку только в анализатор индексации и оставляю ее пустой для анализатора запросов, я могу искать, просто выполняя поиск special_field: Wein, и получаю ожидаемые результаты.

Теперь я вижу, что у solr также есть * -синтаксис. Какая связь между EdgeNGramFilterFactory и * -syntax?

Правильно ли я все делаю или есть лучший, более регулярный способ?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 05 июля 2013

Или просто сделайте простой подстановочный знак:

name:Pe*
1 голос
/ 17 августа 2010

Примечание: я также задавал этот вопрос на форуме Lucene, где я получил хороший ответ: http://lucene.472066.n3.nabble.com/How-to-do-partial-beginning-matches-td781147.html

1 голос
/ 16 августа 2010

Я не рекомендую запрос Wein *.Это реализовано внутри как PrefixQuery, который переписывает исходный запрос, чтобы включить все термины с префиксом, равным «Wein».В зависимости от того, насколько велик ваш индекс (я имею в виду, сколько терминов), такое переписывание запросов может стать узким местом.

EdgeNGramFilter во время индексации - лучший подход.Это решение будет использовать больше места, но запросы будут обрабатываться намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...