solr的问题排查(ugc 项目问题排查)

ugc 项目主要是文章列表和搜索,

问题排查流程:

以 文章列表为例,接口入口 ArticleController 的list 方法。

(1)找出 对应 的 solr 查询query,

设置断点 获取 solrQuery的值。

1
q=*:*&fq=%2B(departure:北京+OR+departure:中国)&fq=audit_time:+[+*+TO+NOW%2B8HOUR+]+AND+end_time:[+NOW%2B8HOUR+TO+*]&fq=status:0&fq=push_start_time:+[+*+TO+NOW%2B8HOUR+]+AND+push_end_time:[+NOW%2B8HOUR+TO+*]&fq=if_pushsy:1&sort=if_pushsy+desc,push_weight+desc,push_start_time+desc,audit_time+desc,quality+desc&start=0&rows=10&fl=en_id,id,score,title,imgs,quality,push_weight,content,search_content,property,show_type,category,user_id,user_en_id,user_info,destination,des_path,channel_en_id,channel_id,push_start_time,push_end_time,audit_time,end_time,if_pushsy,modify_time,status

或者 通过日志找:

如果有报错,会在日志中打印

1
logger.error(" solrCollection : "+solrCollection +" solrQuery: "+solrQuery.toQueryString() );

在日志中搜索 solrCollection 就可以 搜出报错的日志

在/home/q/www/dapp_engine/logs 下的query.log 也可以查看

如果启动的过程中有错误,可以看一下 catalina.out / localhost等

(2)在对应的solr环境下 进行查询,看结果是否符合预期,

如:

线上

beta:

a.点击execute query 会有一条查询,点击对应的查询url,将上个步骤获取到的query ,即 q 替换掉 回车,就可以看到这条查询语句 下对应的结果

如:![刘煜dut > solr的问题排查(ugc 项目问题排查) > 2018-01-25 16-54-18屏幕截图.png])

对应的结果:

(3)solr查询结果分析:

前面的部分是查询的具体参数:fq 相当于sql 的where 起过滤作用 ,sort 用来排序,start 和rows是分页选项

fl 是过滤 指定结果返回的字段都有哪些。

(4)权重分析:

在fl 中加上 score 字段,在结果中返回对应的相似度分数,这里面可以体现出权重。如

在url中加上参数 debug=true 可以看到具体的权重分析

例子:

solr query:

1
http://xxxxxxxxxxxx/qsearch/ugc_engine/select?q=*:*&fq=%2B(departure:%E5%8C%97%E4%BA%AC+OR+departure:%E4%B8%AD%E5%9B%BD)&fq=audit_time:+[+*+TO+NOW%2B8HOUR+]+AND+end_time:[+NOW%2B8HOUR+TO+*]&fq=status:0&defType=edismax&bq=destination:(%E6%95%85%E5%AE%AB)^1000&sort=score+desc,if_pushsy+desc,push_weight+desc,arpu+desc,click_count+desc,audit_time+desc&fl=en_id,id,score,title,imgs,quality,push_weight,content,search_content,property,show_type,category,user_id,user_en_id,user_info,destination,des_path,channel_en_id,channel_id,push_start_time,push_end_time,audit_time,end_time,if_pushsy,modify_time,status&start=0&rows=1

通过bq 对字段添加权重,

使用bq(在 查需 全量 * 的前提下,对满足 bq条件的 数据 添加对应的权重。 )

结果: 得分是1001, 正常查询是1分,我在这个字段上加了 1000分,查出来的数据 匹配bq的条件 加 了1000分,是1000+1 = 1001 分

2.问题分析:

(1)如果 solr 结果正确,接口返回不正确,可能原因: 接口返回结果处理的问题

(2)如果 solr结果 不正确, 可能原因:solr query的拼接问题

3.关于搜索 分词的分析

对于一句话不知道如何控制它搜索的精度,solr 提供了一个analyse的工具。

(1)点击analyse

(2)选择 solr 的 schema中的 字段类型,然后左侧是要测试的值, 右边是 输入的query

下面会给具体的分词情况和 脾气情况,加了阴影的就是匹配到了。

搜索权重 分析的过程 和上面一样,

区别: q 为要搜索的词, 使用 qf 功能, 即 在qf 标注的字段中搜索, 每个字段后面的分数是 权重,如果 匹配到了 会依次相加

例子:

1
q=迪士尼&defType=edismax&qf=search_destination^1000+search_title^100+search_content^10&tie=1&sort=score+desc,quality+desc,audit_time+desc

结果截图:

explain中是具体的 分数计算:

1000.0 = (MATCH) weight(search_destination:迪士尼^1000.0 in 17826) [BoostSimilarity], result of: 1000.0 = (boost is:1000.0 ) 1.0 = termFreq=1.0

说明 命中了search_destination 字段 加1000分

10.0 = (MATCH) weight(search_content:迪士尼^10.0 in 17826) [BoostSimilarity], result of: 10.0 = (boost is:10.0 ) 1.0 = termFreq=1.0 “,

说明 命中了search_content 字段 加10分

总分1010分