2017-02-16 9 views
0

Если у меня есть заданная строка «ABCDEF», как я могу запустить поиск, чтобы получить все результаты там, где он нашел подстроки, такие как «A», «EF» «CDE», «ABCDEF»Solr - поиск всех подстрок заданной строки

У меня возникли проблемы с использованием регулярных выражений, так как поиск строк с некоторыми пропущенными буквами дает мне результаты, подобные «BDE», что является недопустимым, поскольку в этом случае разрешено пропускать «С».

+0

какие запросы вы попробовали? – Mysterion

+0

Вы пробовали использовать NGramFilter? – MatsLindh

+0

Ваш вопрос очень неясен. Какой текст вы индексируете и пытаетесь найти (ABCDEF)? И каковы поисковые строки, которые вы ищете с помощью (A, EF и т. Д.)? –

ответ

0

Вы можете использовать NGramFilter (не токенизатор) в цепочке анализа для текстового поля - он разделит текст на отдельные токены для каждой подстроки представленного текста. Вы можете предоставить минимальную/минимальную длину подстрок, позволяя вам настроить длину генерируемых маркеров.

Если вход только одну строки вы хотите искать подстроки, используйте KeywordTokenizer - это будет держать ввод строки в качестве одного маркеров, который затем используются для generate the substrings with the NgramFilter:

<filter class="solr.NGramFilterFactory"/> 

Значения по умолчанию значения для мин/макс составляет 1 и 2, что дает (из примеров):

In: "four score" 
Tokenizer to Filter: "four", "score" 
Out: "f", "o", "u", "r", "fo", "ou", "ur", "s", "c", "o", "r", "e", "sc", "co", "or", "re" 

В вашем случае вся строка будет храниться как одно значение, так что вы должны были бы «четыре балла» вместо для разделения токенов.

Пример, приведенный для значений 1/4 в примере в вики, в настоящее время неверен (кажется, он был скопирован с EdgeNGramFilter), поэтому игнорируйте это.

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

+0

Большое спасибо. Объяснения очень полезны :) – Pie222

0

Я бы рекомендовал использовать определенную цепочку анализа для случая использования:

<fieldType name="text_ngram" class="solr.TextField"> 
    <analyzer type="index"> 
     ... 
     <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/> 
    </analyzer> 
    <analyzer type="query"> 
     <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt" /> 
     <tokenizer class="solr.StandardTokenizerFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory" 
       generateWordParts="1" generateNumberParts="1" catenateWords="0" 
       catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer> 
</fieldType> 

нотабене во время запроса не выполняйте фильтрацию токенов Ngram, если вы не хотите неожиданного поведения.

[1] https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions#FilterDescriptions-N-GramFilter

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

  • Нет связанных вопросов^_^