基於solr 6.5.0 版本
1. Solr配置同義詞報異常
報錯信息
xxx: org.apache.solr.common.SolrException:org.apache.solr.common.SolrException:
Could not load conf for core xxx: Can't load schema /www/solrhome/xxx/conf
/managed-schema: java.nio.charset.MalformedInputException: Input length = 1
解決
在報該異常之前,對solr進行了同義詞的配置,根據該異常信息,覺得可能是中文配置的問題,因爲在conf/synonyms.txt文件中做了如下中文配置:
查詢相關文檔,發現可能是synonyms.txt文件的編碼格式不是UTF-8導致的,使用notepad++工具查看該文件的編碼格式:
接下來通過notepad工具將該文件的編碼格式改爲 UTF-8並保存,放進conf文件夾替換原有的synonyms.txt文件,重啓tomcat,異常解決
注意: 這裏要注意synonyms.txt文件不要直接打開編輯
2. Solr配置同義詞無效
在[solr-core]/conf/managed-schema 文件做如下配置,synonyms負責配置同義詞
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
<charFilter class="solr.HTMLStripCharFilterFactory" />
</analyzer>
</fieldType>
在synonyms.txt文件裏做了如下配置:
有關 => 關於
土增,土增稅,土地增值稅
看下效果,發現並沒有搜出同義詞,這是爲什麼呢?會不會是同義詞被分詞所導致的,試着將同義詞配置到專有詞裏
在專有詞的文件ext.dic 存入專有詞
土增
土增稅
土地增值稅
這時同義詞就能被搜出來了
3. solr配置高亮詞、摘要的長度
solr配置高亮詞,可通過solrJ庫進行獲取
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("keydown:" + keyword) //搜索的關鍵詞
.setRows(sp.getPageSize()) //頁數
.setStart(sp.getStartNum()) //頁碼
.setHighlightFragsize(120) //高亮摘要句子的長度
.addSort("score",ORDER.desc) //排序
.addSort("issueDate", ORDER.desc)
.addSort("type",ORDER.asc)
.addHighlightField(wenhao) //需要設置高亮的字段
.addHighlightField(name)
.addHighlightField(content)
.setHighlightSimplePre("<span style=\"color:red\">") //配置高亮的前綴
.setHighlightSimplePost("</span>"); //配置高亮的後綴
也可以通過solr目錄下的/conf/solrconfig.xml文件進行配置:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="defType">edismax</str>
<str name="qf">name^20 descripe^2 text ^2</str>
<str name="hl.usePhraseHighlighter">false</str>
<str name="hl.useFastVectorHighlighter">true</str>
<str name="hl.boundaryScanner">breakIterator</str>
<str name="hl.encoder">html</str>
<str name="hl.formatter">htmla</str>
</lst>
</requestHandler>
<searchComponent class="solr.HighlightComponent" name="highlight">
<highlighting>
<formatter name="htmla" default="true" class="solr.highlight.HtmlFormatter">
<lst name="defaults">
<str name="hl.simple.pre"><![CDATA[<b>]]></str>
<str name="hl.simple.post"><![CDATA[</b>]]></str>
</lst>
</formatter>
<encoder name="html" class="solr.highlight.HtmlEncoder" />
<boundaryScanner name="default" default="false" class="solr.highlight.SimpleBoundaryScanner">
<lst name="defaults">
<str name="hl.bs.maxScan">10</str>
<str name="hl.bs.chars">.,!? </str>
</lst>
</boundaryScanner>
<boundaryScanner name="breakIterator" default="true" class="solr.highlight.BreakIteratorBoundaryScanner">
<lst name="defaults">
<str name="hl.bs.type">SENTENCE</str>
</lst>
</boundaryScanner>
</highlighting>
</searchComponent>