Solr фильтр или токенизатор, чтобы сделать комбинации слов - PullRequest
2 голосов
/ 27 сентября 2011

Я пытаюсь реализовать разумную функцию подсказки имени, используя серию фильтров. На данный момент у меня есть

        <fieldType name="suggester" class="solr.TextField" positionIncrementGap="1" autoGeneratePhraseQueries="true">
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
                    catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ShingleFilterFactory" outputUnigramsIfNoShingles="true" maxShingleSize="2"
                    outputUnigrams="true"/>
            <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
                    catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ShingleFilterFactory" outputUnigramsIfNoShingles="true" maxShingleSize="2"
                    outputUnigrams="true"/>
            <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="15"/>
        </analyzer>
    </fieldType>

Который, безусловно, нуждается в дополнительной настройке, но я хотел бы остановиться на одном конкретном аспекте этого вопроса. Для входной строки mark daniel sievers вышеупомянутое совпадет с запросом на mark и sievers, но я действительно хочу уменьшить детализацию EdgeNGramFilter, потому что это вызывает несовпадение, и использовать фильтр / токенизатор, который может комбинировать слова в некотором настраиваемом порядке, например, для ввода mark daniel rex sievers создать токены mark sievers, mark daniel sievers, mark rex sievers и так далее. Я не применял какой-либо конкретный алгоритм для этого, но мне интересно, существует ли такой зверь (почти наверняка) или лучше написать свой собственный в качестве плагина фильтра?

Solr 3.3.0

1 Ответ

5 голосов
/ 18 ноября 2011

Я бы использовал ShingleFilter: http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ShingleFilterFactory

Например:

<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true"/>

Ввод: mark daniel sievers.

Произведено жетонов: mark, mark daniel, mark daniel sievers, daniel, daniel sievers, sievers.

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