我有一个关于mysql db的城市列表,它被挂钩到用于自动完成目的的UI上。我目前正在使用solr-5.3.0。数据导入通过预定的delta导入进行。我有以下问题:
我想对此功能实施拼写检查。我尝试使用:
在这3个中只有FileBasedSpellChecker能够给出 仅存在于db上的建议。例如,在搜索时 古龙水我有像
这样的结果 {
"responseHeader":{
"status":0,
"QTime":4,
"params":{
"q":"searchfield:kolakata",
"indent":"true",
"spellcheck":"true",
"wt":"json"}},
"response":{"numFound":0,"start":0,"docs":[]
},
"spellcheck":{
"suggestions":[
"cologne",{
"numFound":4,
"startOffset":12,
"endOffset":19,
"suggestion":["Cologne",
"Bologna",
"Cogne",
"Bastogne"]}],
"collations":[
"collation","searchfield:Cologne"]}}
这些城市非常准确,存在于db / file中。
但是当我使用其他2时,我得到了像
这样的结果 {
"responseHeader":{
"status":0,
"QTime":4,
"params":{
"q":"searchfield:kolakata",
"indent":"true",
"spellcheck":"true",
"wt":"json"}},
"response":{"numFound":0,"start":0,"docs":[]
},
"spellcheck":{
"suggestions":[
"cologne",{
"numFound":4,
"startOffset":12,
"endOffset":19,
"suggestion":["Cologne",
"Cologn",
"Colognei"]}],
"collations":[
"collation","searchfield:Cologne"]}}
我的数据库中没有这些城市。
虽然FileBasedSpellChecker给出了满意的结果,但是我 我有点担心使用它们,因为我需要保留 每次添加/删除新城市时手动更新文件。 此外,通常不建议使用FileBasedSpellChecker 一般
我还需要搜索建议,这意味着 目前我正在访问
中返回的文档"responseHeader":{"response":{"docs":[<some-format>]}}
在该城市搜索结果,但现在我想要建议者
将结果返回到相同的<some-format>
而不是仅仅
字符串结果,以使其与UI正确集成。
要求的一个小改动是按升序对建议进行排序 编辑顺序/ levenshtein距离。这不是一个硬性要求 并且可以与之协商。
修改 我的solrconfig看起来像这样:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">searchfield</str>
<str name="spellcheck">true</str>
<str name="spellcheck.collate">true</str>
<str name="spellcheck.dictionary">file</str>
<str name="spellcheck.maxCollationTries">5</str>
<str name="spellcheck.count">5</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>
和
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">text_ngram</str>
<lst name="spellchecker">
<str name="name">file</str>
<str name="classname">solr.FileBasedSpellChecker</str>
<str name="sourceLocation">spellings.txt</str>
<str name="spellcheckIndexDir">./spellchecker</str>
</lst>
</searchComponent>
架构如下所示:
<field name="name" type="string" indexed="true" stored="true" multiValued="false" />
<field name="latlng" type="location" indexed="true" stored="true" multiValued="false" />
<field name="citycode" type="string" indexed="true" stored="true" multiValued="false" />
<field name="country" type="string" indexed="true" stored="true" multiValued="false" />
<field name="searchscore" type="float" indexed="true" stored="true" multiValued="false" />
<field name="searchfield" type="text_ngram" indexed="true" stored="false" multiValued="true" omitNorms="true" omitTermFreqAndPositions="true" />
<defaultSearchFieldsearchfield</defaultSearchField>
<solrQueryParser defaultOperator="OR"/>
<copyField source="name" dest="searchfield"/>