将SOLR自动完成功能用于多个术语(即以逗号分隔的位置)

时间:2012-01-02 21:38:54

标签: autocomplete solr

我已经启动并运行SOLR,通过DIH索引数据,并正确返回查询结果。我正在尝试设置另一个核心来运行建议器,以便自动完成地理位置。我们有一个Web应用程序,需要采取城市,州/地区,国家输入。我们想在一个输入框中执行此操作。以下是一些例子:

布鲁克林,纽约,美利坚合众国 费城,宾夕法尼亚州,美利坚合众国 巴塞罗那,加泰罗尼亚,西班牙

现在假设世界上的每个位置都可以分成这个3字形输入。我已经设置了我的DIH来创建一个TemplateTransformer字段,该字段将4个表(城市,州和国家都是由主席位表相互连接的独立表)组合成一个名为“fullplacename”的字段:

<field column="fullplacename" template="${city_join.plainname},
${region_join.plainname}, ${country_join.plainname}"/>

我在schema.xml中定义了一个“text_auto”字段:

<fieldType class="solr.TextField" name="text_auto">
    <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

并定义了这两个字段:

<field name="name_autocomplete" type="text_auto" indexed="true" stored="true" multiValued="true" />
<copyField source="fullplacename" dest="name_autocomplete" />

现在,这是我的问题。这适用于第一学期,即如果我输入“brooklyn”,我会得到我期望的结果,使用此URL进行查询:

http://localhost:8983/solr/places/suggest?q=brooklyn

然而,只要我在其中放入逗号和/或空格,就会将它们分成2条建议,我会为每个建议提出建议:

http://localhost:8983/solr/places/suggest?q=brooklyn%2C%20ny

给我一​​个关于“布鲁克林”的建议和对“ny”的建议,而不是与“brooklyn,ny”匹配的建议。我已经尝试过我可以通过谷歌找到的所有解决方案,但没有任何运气。是否有一些我错过的简单,或者这是错误的方法?

谢谢!

编辑:以防万一,这里是searchComponent和requestHandler定义:

<requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler">
    <lst name="defaults">
        <str name="spellcheck">true</str>
        <str name="spellcheck.dictionary">suggest</str>
        <str name="spellcheck.count">10</str>
    </lst>
    <arr name="components">
        <str>suggest</str>
    </arr>
</requestHandler>

<searchComponent name="suggest" class="solr.SpellCheckComponent">
    <lst name="spellchecker">
        <str name="name">suggest</str>
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
        <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
        <str name="field">name_autocomplete</str>`<br/>
    </lst>
</searchComponent>

3 个答案:

答案 0 :(得分:2)

问题出在建议者身上。就像拼写检查器一样,它在空格上进行标记。

http://lucene.472066.n3.nabble.com/suggester-issues-tp3262718p3266140.html有解决此问题的方法。

答案 1 :(得分:0)

您正在使用KeywordTokenizer,它不会为“布鲁克林”,“纽约”和“美国”创建单独的令牌。

您的示例查询看起来不像自动完成,但更像是常规搜索。

自动填充查询(恕我直言)仅包含部分字词:

http://localhost:8983/solr/places/suggest?q=brook

表示提前输入列表。您想要使用EdgeNGram:http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory 最有可能与StandardTokenizer和/或WordDelimiterFilterFactory合并。

对于您的查询示例:

http://localhost:8983/solr/places/suggest?q=brooklyn%2C%20ny

StandardTokenizer与LowercaseFilter和dismax请求处理程序结合使用,并具有mm参数的良好配置 - 限制命中包含所有输入术语的命中 - 可以正常工作,请参阅:http://wiki.apache.org/solr/DisMaxQParserPlugin#mm_.28Minimum_.27Should.27_Match.29

答案 2 :(得分:0)

我觉得接受的答案有点过于复杂。一种优雅的方法是使用http://localhost:8983/solr/places/suggest?spellcheck.q=brooklyn代替http://localhost:8983/solr/places/suggest?q=brooklyn。如上所述here