使用NGrams使用Solr自动完成搜索

Ani*_*nti 4 solr autocomplete n-gram

我正在使用EdgeNGrams 与Solr进行自动完成搜索.如果用户正在搜索员工的姓名,则应该应用自动完成.也就是说,我希望结果就像Google搜索一样.它适用于某些搜索.

档案schema.xml:

<fieldType name="edgytext" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
    <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="15" side="front" />
    </analyzer>
Run Code Online (Sandbox Code Playgroud)

<field name="title" type="edgytext" indexed="true" stored="true" omitNorms="true" omitTermFreqAndPositions="true"/>
<field name="empname" type="edgytext" indexed="true" stored="true" omitNorms="true" omitTermFreqAndPositions="true" />

<field name="autocomplete_text" type="edgytext" indexed="true" stored="false"  multiValued="true" omitNorms="true" omitTermFreqAndPositions="false" />
<copyField source="empname" dest="autocomplete_text"/>

<copyField source="title" dest="autocomplete_text"/>
Run Code Online (Sandbox Code Playgroud)
 http://local:8080/test/suggest/?q=michael
Run Code Online (Sandbox Code Playgroud)

结果:

<?xml version="1.0" encoding="UTF-8" ?>
<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">1</int>
    </lst>
    <result name="response" numFound="0" start="0" />
    <lst name="spellcheck">
        <lst name="suggestions">
            <lst name="michael">
                <int name="numFound">9</int>
                <int name="startOffset">0</int>
                <int name="endOffset">7</int>
                <arr name="suggestion">
                    <str>michael bolton</str>
                    <str>michael foret</str>
                    <str>michael houser</str>
                    <str>michael o'brien</str>
                    <str>michael penn</str>
                    <str>michael row your boat ashore</str>
                    <str>michael tilson thomas</str>
                    <str>michael w. smith</str>
                    <str>michael w. smith featuring andrae crouch</str>
                </arr>
            </lst>
            <str name="collation">michael bolton</str>
        </lst>
    </lst>
</response>
Run Code Online (Sandbox Code Playgroud)

它对我来说很好.当我搜索时michael f

http:// local:8080/test/suggest/?q=michael f
Run Code Online (Sandbox Code Playgroud)

我收到如下回复:

<?xml version="1.0" encoding="UTF-8" ?>
<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">1</int>
    </lst>
    <result name="response" numFound="0" start="0" />
    <lst name="spellcheck">
        <lst name="suggestions">
            <lst name="michael">
                <int name="numFound">9</int>
                <int name="startOffset">0</int>
                <int name="endOffset">7</int>
                <arr name="suggestion">
                    <str>michael bolton</str>
                    <str>michael foret</str>
                    <str>michael houser</str>
                    <str>michael o'brien</str>
                    <str>michael penn</str>
                    <str>michael row your boat ashore</str>
                    <str>michael tilson thomas</str>
                    <str>michael w. smith</str>
                    <str>michael w. smith featuring andrae crouch</str>
                </arr>
            </lst>
            <lst name="f">
                <int name="numFound">10</int>
                <int name="startOffset">8</int>
                <int name="endOffset">9</int>
                <arr name="suggestion">
                    <str>f**k the facts</str>
                    <str>fairest lord jesus</str>
                    <str>fatboy slim</str>
                    <str>ffh</str>
                    <str>fiona apple</str>
                    <str>foo fighters</str>
                    <str>frank sinatra</str>
                    <str>frans bauer</str>
                    <str>franz ferdinand</str>
                    <str>françois rauber</str>
                </arr>
            </lst>
            <str name="collation">michael bolton f**k the facts</str>
        </lst>
    </lst>
</response>.
Run Code Online (Sandbox Code Playgroud)

当我用michael f那时搜索时,我应该michael foret只获得.数据开始于f.我在Solr中的配置设置有什么问题吗?

jav*_*nna 6

我写了这个博客,介绍了使用Solr进行自动建议的不同方法以及为了做出正确选择而应该问自己的一些问题.简而言之,开箱即用的方式是:

  • 方面前缀
  • n元语法
  • TermsComponent
  • 建议者

它们同时具有优势和局限性,我建议你阅读这篇文章.

如果您正在寻找一个完整而灵活的解决方案,这需要更多的工作,您也可以查看本文.

如果您已经决定使用NGrams,根据您的示例,您可以使用带有minGramSize 1的EdgeNGramFilterFactory索引您的员工,然后搜索该字段以进行自动建议.对于客户端部分,您需要使用一些JavaScript.

  • 您可以编辑您的问题并添加这些详细信息吗?乍一看,您的架构看起来很好,在应用更改后是否重新索引数据?你在哪个领域搜索?您还可以查看Solr分析页面,了解如何解析查询以及如何对数据编制索引. (2认同)