首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NGrams的Solr自动完成搜索

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

Stack Overflow用户
提问于 2012-08-01 04:38:01
回答 1查看 7.4K关注 0票数 5

我正在使用索尔使用EdgeNGrams进行自动完成搜索。如果用户正在搜索员工姓名,则应应用自动完成。也就是说,我希望结果像谷歌搜索一样。对一些搜索来说很好。

文件schema.xml

代码语言:javascript
复制
<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>

代码语言:javascript
复制
<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"/>
代码语言:javascript
复制
 http://local:8080/test/suggest/?q=michael

结果:

代码语言:javascript
复制
<?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搜索时

代码语言:javascript
复制
http:// local:8080/test/suggest/?q=michael f

我得到的回应是:

代码语言:javascript
复制
<?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中的配置设置有什么问题吗?

EN

回答 1

Stack Overflow用户

发布于 2012-08-01 07:40:42

我写了一些关于用Solr做自动建议的不同方法的旧链接,以及一些你应该问自己的问题,以便做出正确的选择。简单地说,开箱即用的方式是:

  • 面前缀
  • NGrams
  • TermsComponent
  • 暗示者

它们都有优点和局限性,同时,我建议你阅读这篇文章。

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

如果您已经决定使用NGrams,给出您的示例,您可以使用EdgeNGramFilterFactory对员工进行minGramSize 1索引,然后搜索该字段以提供自动建议。对于客户端部分,需要使用一些javascript。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11752631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档