【问题标题】:Using SOLR Autocomplete for multiple terms (i.e. comma-separated locations)对多个术语使用 SOLR 自动完成(即逗号分隔的位置)
【发布时间】:2012-01-02 21:38:53
【问题描述】:

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

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

现在假设世界各地的每个位置都可以拆分为这个 3-form 输入。我已经设置了我的 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

给我一​​个关于“brooklyn”的建议和一个关于“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>

【问题讨论】:

  • 您是否尝试过在用户输入时不向 SOLR 发送逗号?

标签: autocomplete solr


【解决方案1】:

问题在于建议者。就像它在空格上标记的拼写检查器一样。

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

【讨论】:

  • 这有帮助,谢谢!唯一的问题是它似乎过于严格。输入“brooklyn, n”会提示“brooklyn, ny, United States”,但输入“new york”或“ny”不起作用。
【解决方案2】:

您正在使用不会为“Brooklyn”、“NY”和“United States”创建单独标记的 KeywordTokenizer。

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

自动完成查询 (IMHO) 仅包含部分术语:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      相关资源
      最近更新 更多