Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对多个术语使用SOLR Autocomplete(即逗号分隔的位置)_Autocomplete_Solr - Fatal编程技术网

对多个术语使用SOLR Autocomplete(即逗号分隔的位置)

对多个术语使用SOLR Autocomplete(即逗号分隔的位置),autocomplete,solr,Autocomplete,Solr,我已经启动并运行SOLR,通过DIH索引数据,并正确返回查询结果。我正在尝试设置另一个核心来运行suggester,以便自动完成地理位置。我们有一个web应用程序,需要接受城市、州/地区和国家的输入。我们希望在单个输入框中执行此操作。以下是一些例子: 美国纽约布鲁克林 美利坚合众国宾夕法尼亚州费城 巴塞罗那,加泰罗尼亚,西班牙 现在假设世界上的每个地方都可以分成3种形式的输入。我已将DIH设置为创建TemplateTransformer字段,该字段将4个表(城市、州和国家都是通过主位置表相互连接

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

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

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


我在schema.xml中定义了一个“text\u 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 http://localhost:8983/solr/places/suggest?q=brooklyn 但是,只要我在其中添加逗号和/或空格,就会将它们分成两个建议,每个建议我都会得到一个建议:

http://localhost:8983/solr/places/suggest?q=brooklyn%2C%20ny 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>

真的
建议
10
建议
建议
org.apache.solr.spelling.Suggester
org.apache.solr.spelling.suggest.tst.TSTLookup
名称\u自动完成`

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


有此问题的解决方案。

您使用的关键字标记器不会为“Brooklyn”、“NY”和“United States”创建单独的标记

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

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

http://localhost:8983/solr/places/suggest?q=brook
用于提前输入列表。您希望使用Edengram来实现以下目标: 最可能与StandardTokenizer和/或WordDelimiterFilterFactory结合使用

对于您的查询示例:

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

StandardTokenizer与LowercaseFilter和dismax请求处理程序结合使用,并具有良好的mm参数配置—将命中限制为包含所有输入项的命中—将很好地工作,请参见:

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

当用户键入逗号时,您是否尝试过不向SOLR发送逗号?这很有帮助,谢谢!唯一的问题是它似乎限制太多。输入“brooklyn,n”表示“brooklyn,ny,united states”,但输入“new york”或“ny”则不起作用。
http://localhost:8983/solr/places/suggest?q=brooklyn%2C%20ny