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

标签 autocomplete solr 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>




<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"/>




 http://local:8080/test/suggest/?q=michael


结果:

<?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>


对我来说很好。当我用michael f搜索时

http:// local:8080/test/suggest/?q=michael f


我得到的答复是:

<?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>.


当我用michael f搜索时,我应该只得到michael foret。数据以f开头。 Solr中的配置设置有什么问题吗?

最佳答案

我写了[旧链接]有关使用Solr进行自动建议的不同方法,以及一些您应该问自己的问题,以便做出正确的选择。简而言之,现成的方法是:


构面前缀
NGrams
条款组件
建议者


它们同时具有优势和局限性,建议您阅读本文。

如果您正在寻找需要更多工作的完整而灵活的解决方案,那么也可以看看this article

如果您已决定使用NGrams,则根据您的示例,您可以使用带有minGramSize 1的EdgeNGramFilterFactory索引员工,然后在该字段上进行搜索以提出自动建议。对于客户端,您需要使用一些javascript。

关于autocomplete - 使用NGrams使用Solr自动完成搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11752631/

相关文章:

xcode - 如何使 Xcode 自动完成@property

c# - 内容搜索、重建索引错误

search - ElasticSearch问题与匹配结果

visual-studio - Visual Studio 2015 社区 + Resharper 9 : 2 pop-up lists show for intellisense

autocomplete - 在 Wicket 中可视化自定义自动完成

c++ - 如何更改QCompleter的弹出列表的位置?

elasticsearch - 在lucene中查询*:value的含义是什么?

function - _val_ : do in Solr and what is it for? 是什么意思

elasticsearch - ElasticSearch搜索部分字母数字值

java - 从一个句子生成 N-gram