solr使用中遇到的问题

时间:2024-04-02 14:52:37

1.剔除数据 ----在搜索时,想将某些结果排除掉,我们可以使用操作符 “-”进行排除查询。即:-field:value。

例:剔除id为123的数据

filterQuery.addFilter("-id:123")

2.SolrServerException: No live SolrServers available to handle this request:[http://192.168.200.8:7788/dxysearch/antibody_

shard1_replica2, http://192.168.200.7:7788/dxysearch/antibody_shard1_replica1]

Caused by: org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: Expected mime type application/octet-stream but got text/html. <html>

解决方案:

3.no field name specified in query and no default specified via 'df' param"

solrconfig.xml中handler里面配置df:

<str name="df">text</str>

4.SOLR搜索时候常会出现以下问题,比如搜索“大鼠” 可以搜索到结果,但是 大和鼠之间加个空格结果就不一样了。

设置默认搜索字段的效果:搜索条件为 title:随意 问,中间的空格默认相当于OR,"text"优先于"name",因此搜索条件等价于 title:随意 OR text:问,所以会搜索不出结果。

建议解决方法:<前三种方法不灵活>

方法1:可以将搜索条件变为 title:(随意 问),等价于 title:随意 OR title:问。 

方法 2:搜索条件不变,查询时URL加上df参数"&df=title",也可以解决。

方法3:把

<str name="df">text</str>
改为你要默认的查询字段比如改为name  搜索"茶 油"的时候 及类似鱼 name="茶" or  name="油"
最终使用的解决方案:使用org.apache.solr.client.solrj.util.ClientUtils类中的escapeQueryChars(String s)方法对字符串转义。

str = ClientUtils.escapeQueryChars(str);

5.solr中fq分开设置,利于缓存。

6.solr的index和query过程忽略大小写时,如果要全词匹配(q中有字母时,大写优先于全词匹配),须将q用""引起来。

  • solr使用中遇到的问题
  • 引号引起来之后:
  • solr使用中遇到的问题

7. solr默认空格将query分成不同的字句,如q=绵羊Thymidylate Synthase多克隆抗体,被solr解析为:

  • parsedquery_toString"+(((((product_name:绵羊 product_name:thymidylate)~2))~0.6 (((product_name:synthase product_name:多克隆 product_name:抗体)~2))~0.6)~2)"
  • 这样相似度排序就会出现不理想的结果。当时采用调整mm值来控制()。
  • 解决思路:在后端对q作如下处理:判断后在第一个字母(或单词)前空格。

8. schema.xml配置中<uniqueKey>id</uniqueKey>,如果id改为其他配置,offline创建索引时会报以下错误。

2018-02-09 15:04:07,852: ERROR: simpleManager.py: 204: Traceback (most recent call last):
  File "/home/zhaob/gitlab/search_offline/src/simpleManager.py", line 201, in importBySql
    count = importBySqlExe(sql, core, dbClient_g)
  File "/home/zhaob/gitlab/search_offline/src/simpleManager.py", line 126, in importBySqlExe
    (addNum, filterNum, errorNum) = solrutils.addRowsToSolr(newRows)
  File "/home/zhaob/gitlab/search_offline/src/solrUtils.py", line 276, in addRowsToSolr
    self.add(docs)
  File "/home/zhaob/gitlab/search_offline/src/solrUtils.py", line 218, in add
    self.solrClient.add_many(docs)
  File "/home/zhaob/.local/lib/python2.7/site-packages/solr/core.py", line 326, in wrapper
    return self._update(content, query)
  File "/home/zhaob/.local/lib/python2.7/site-packages/solr/core.py", line 550, in _update
    rsp = self._post(selector, request, self.xmlheaders)
  File "/home/zhaob/.local/lib/python2.7/site-packages/solr/core.py", line 639, in _post
    return check_response_status(self.conn.getresponse())
  File "/home/zhaob/.local/lib/python2.7/site-packages/solr/core.py", line 1102, in check_response_status
    raise ex
SolrException: HTTP code=400, reason=Bad Request

2018-02-09 15:04:07,852: ERROR: simpleManager.py: 205: <class 'solr.core.SolrException'>

原因:offline中row doc 和sql字段需与solrcloud中的field字段严格对应。

9.solrconfig.xml配置:指定的搜索字段放在qf中。默认搜索字段放在df中。

10.schema.xml中配置的字段如果是string,则默认是全匹配搜索。

11. 搜索结果如果要高亮或者facet等processor,必须返回id。

12. 一个可能的经验法则:查看Solr每秒钟查询的次数。如果每分钟垃圾收集数量超过该值,那么堆可能太小。