Solr 部署与使用踩坑全记录 (4)

分页查询并对高亮关键字:

SolrQuery solrQuery = new SolrQuery("苹果"); QueryOptions queryOptions = new QueryOptions { // 高亮关键字 Highlight = new HighlightingParameters { Fields = new List<string> { "post_title" }, BeforeTerm = "<font color='red'><b>", AfterTerm = "</b></font>" }, // 分页 StartOrCursor = new StartOrCursor.Start(pageIndex * pageSize), Rows = pageSize }; SolrQueryResults<PostDoc> docs = await solr.QueryAsync(solrQuery, queryOptions); var highlights = docs.Highlights;

高亮关键字需要在返回结果中单独获取,docs.Highlights 是一个 IDictionary<string, HighlightedSnippets> 对象,每个 key 对应文档的 id,HighlightedSnippets 中也是一个 Dictionary,存储高亮处理后的字段和内容。

Python 项目中使用 Solr

PySolr:https://github.com/django-haystack/pysolr
使用 pip 安装 pysolr:

pip install pysolr

简单的操作:

# -*- coding: utf-8 -*- import pysolr SOLR_URL = 'http://localhost:8983/solr/posts' def add(): """ 添加 """ result = solr.add([ { 'id': '20000', 'post_title': 'test-title-20000', 'post_name': 'test-name-20000', 'post_excerpt': 'test-excerpt-20000', 'post_content': 'test-content-20000', 'post_date': '2019-06-18 14:56:55', }, { 'id': '20001', 'post_title': 'test-title-20001', 'post_name': 'test-name-20001', 'post_excerpt': 'test-excerpt-20001', 'post_content': 'test-content-20001', 'post_date': '2019-06-18 14:56:55', } ]) solr.commit() results = solr.search(q='id: 20001') print(results.docs) def delete(): """ 删除 """ solr.delete(q='id: 20001') solr.commit() results = solr.search(q='id: 20001') print(results.docs) def update(): """ 更新 """ solr.add([ { 'id': '20000', 'post_title': 'test-title-updated', 'post_name': 'test-name-updated', 'post_excerpt': 'test-excerpt-updated', 'post_content': 'test-content-updated', 'post_date': '2019-06-18 15:00:00', } ]) solr.commit() results = solr.search(q='id: 20000') print(results.docs) def query(): """ 查询 """ results = solr.search('苹果') print(results.docs) if __name__ == "__main__": solr = pysolr.Solr(SOLR_URL) add() delete() update() query()

需要注意的是在使用 solr.add() 和 solr.delete 方法以后需要执行一下 solr.commit() 方法,否则文档的变更不会提交。
如果想获取添加或更新是否成功可以通过判断 solr.commit() 方法返回结果,solr.commit() 方法的返回结果是一个 xml 字符串:

<?xml version="1.0" encoding="UTF-8"?> <response> <lst> <int>0</int> <int>44</int> </lst> </response>

status 的值如果是 0 就表示提交成功了。

总结

通过简单使用和测试,就会发现搜索结果并不是很精准,比如搜索“微软”这个关键字,搜索出来的数据中有完全不包含这个关键字的内容,所以要想让搜索结果更加准确就必须对 Sorl 进行调优,Solr 中还有很多高级的用法,例如设置字段的权重、自定义中文分词词库等等,有机会我会专门写一篇这样的文章来介绍这些功能。
我在 sql 目录里提供了数据库脚本,方便大家创建测试数据,数据是以前做的一个小站从网上抓取过来的科技新闻。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgjpw.html