【问题标题】:Auto completion search with Solr using NGrams使用 NGrams 使用 Solr 进行自动完成搜索
【发布时间】:2012-07-29 23:00:26
【问题描述】:

我正在使用 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 Powered ISFDB – Part #9: Autocomplete。您确实需要阅读整个系列,但这是对 Solr 的一个很好的介绍。
  • 感谢您的编辑。乍一看,您的架构看起来不错,您是否在应用更改后重新索引数据?您在哪个领域搜索?您还可以查看 Solr 分析页面,了解如何解析查询以及如何为您的数据编制索引。
  • 如果您得到的答案对您有用,您能接受吗?
  • 谢谢,我的问题还是没有解决...stackoverflow.com/questions/12174672/…
  • 解决了。下面的链接是帖子。 lucene.472066.n3.nabble.com/…

标签: autocomplete solr n-gram


【解决方案1】:

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

  • 构面前缀
  • Ngram
  • 条款组件
  • 建议者

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

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

如果您已经决定使用 NGrams,则根据您的示例,您可以使用 EdgeNGramFilterFactory 和 minGramSize 1 为您的员工编制索引,然后在该字段上搜索以做出自动建议。对于客户端部分,您需要使用一些 javascript。

【讨论】:

  • 感谢下面的回复是我在 schema.xml 中的代码
  • 当我用名字“mado”或“madonna”搜索员工姓名时。但是用“madon”搜索时没有得到任何数据。请帮我解决这个问题。
  • 您能否编辑您的问题并添加这些详细信息?乍一看,您的架构看起来不错,您是否在应用更改后重新索引数据?您在哪个领域搜索?您还可以查看 Solr 分析页面,了解如何解析查询以及如何为您的数据编制索引。
  • 我正在搜索 title 和 empname 字段。
  • 解决了。下面的链接是我的帖子。 lucene.472066.n3.nabble.com/…
猜你喜欢
  • 2015-04-10
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
相关资源
最近更新 更多