2016-12-15 2 views
0

У меня есть требование, где я должен соответствовать подстроке в запросе. например, если поле имеет значение:Подстрока match в запросе solr

PREFIXabcSUFFIX

Я должен создать запрос, который соответствует abc. Я всегда знаю длину префикса.

Я не могу использовать EdgeNgram и Ngram из-за ограниченного пространства. (Как они будут создавать несколько индексов.)

Так что мне нужно сделать это на время запроса, а не по времени индекса. Использование подстановочного знака в качестве префикса-то вроде *abc* будет иметь большое влияние на производительность.

Поскольку я буду знать длину префикса, я надеюсь, что у меня есть способ сделать что-то вроде ....abc*, где точки представляют точную длину префикса, так что запрос не так плох, как поиск всего индекса как в случае запроса дикой карты (*abc*).

Возможно ли это в solr? Спасибо за ваше время .

Solr версия: 4,10

ответ

3

Конечно, Wildcard синтаксис documented here, вы могли бы найти что-то вроде ????abc*. Вы также можете использовать запрос регулярного выражения.

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

1

Для этого вы можете использовать the RegularExpressionPatternTokenizer. В приведенном ниже примере я догадался, что длина вашего префикса равна 6. Ваш пример текста PREFIXabcSUFFIX станет abcSUFFIX. Таким образом, вы можете искать abc*

<analyzer> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern=".{6}(.+)" group="1"/> 
</analyzer> 

О Tokenizer:

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

Смежные вопросы