搜索系统
??问题:搜索原理 分片和查询优化!!!
solr 基于lucence的服务器 war包???
lucence api??
step0:java开发的:需要jdk环境
step1:安装solr solr目录结构
bin/ 启动的容器是jetty 也可以tomcat
contrib/ 扩展包
dist/ 目标文件编译出来的目录 war sorj客户端jar
example/ solr solrhome有一些配置文件
step2:tomcat
mkdir /usr/local/solr
cp apache-tomcat-7.0.47 -r /usr/local/solr/tomcat
把solr的war(dist里)部署到tc里
启动tc war自动解压
step3:拷贝所需要jar example/lib/ext *
到tc的solr工程WEB-INF/lib
step4:cp -r example/solr /usr/local/solr/solrhome
step5:web.xml env-entry solrhome
step6:启动tc
step7:访问solr主页
有关solr“域”的概念:必须先定义后使用
需要哪些域?
id(下一步点击搜索出的某商品需要查查询)
title sellpoint image status
cat_name(联合两个表)
step1:IK分析器的jar 加入solr工程的lib
step2:dic(2个) 和 xml 加入solr的classes
step3:solrhome/collection1/conf/schema.xml
指定分词的分析器:fieldtype是TextField
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
fieldType>
step4:定义业务域
每个文档都需要有个id域
复制域:copyField 把一些业务域复制加入“关键词”业务域 搜索的需要
"item_title" type="text_ik" indexed="true"
stored="true"/>
"item_sell_point" type="text_ik" indexed="true"
stored="true"/>
"item_price" type="long" indexed="true"
stored="true"/>
"item_image" type="string" indexed="false"
stored="true" />
"item_category_name" type="string" indexed="true"
stored="true" />
"item_keywords" type="text_ik" indexed="true"
stored="false" multiValued="true"/>
"item_title" dest="item_keywords"/>
"item_sell_point" dest="item_keywords"/>
"item_category_name" dest="item_keywords"/>
step5: 保存 重启tc
step6:solr主页,点击“Analysis”
可选择FieldType 就可以做一些分词的实验
和事务的配置
这次可别忘了web.xml
搜索:和dao没关系!!!?查询的是索引库,但是初始导入需要从数
据库导入
step1:编写联合查询sql:
SELECT
a.id,
a.title,
a.sell_point,
a.price,
a.image,
b.name
category_name
FROM
tb_item
a
LEFT JOIN tb_item_cat b ON a.cid = b.id
WHERE a.status
=1
step02:
搜索定制的pojo,别的层也可能用到,放common:SearchItem
public class SearchItem implements Serializable{
private String id;
private String title;
private String sell_point;
private long price;
private String image;
private String category_name;
}
getters/setters 不能落下
step03:
search-service中编写ItemMapper
List getItemList();
编写同名xml
step04:service层
难点:写入数据到索引库,通过客户端solrj
4.1 把solrj的依赖加入service
4.2 测试solrj addDocument()
创建服务器,创建文档,向文档添加域,把文档写入索引库,提交
deleteDocument()两种方式
4.3 interface:E3Result importAllItems();
4.4 service:实现
注意:自己的Mapper要让ac-dao.xml扫描到
注入solorServer(spring容器,单例)
完成异常处理,返回E3Result.build(error_code.”msg”);
**万能对象E3Result
!!【非常重要】异常处理的利器,异常消化在service层
4.5表现层 manager-web
引入search-interface接口
引入服务
controller:”/index/item/import”
【异常处理】:BindingException:
接口和文件不在一个目录下:找不到xml,它们作为resources默认在
resources源下搜寻,却出现在java源里,应该在pom里配置资源映射:
*后台删除节点:用xml
默认搜索域:text solrconfig.xml(solrhome下某子目录)
requestHandler select
df 默认搜索域
API小计:
query可以创建,可以各种set
server.query方法 得到qr
QueryResponse.getxxx 取文档列表 高亮显示结果等等
取高亮结果时候注意:防御性编程(搜索域和高亮显示域不一致时候)
,复杂的map结果结构
dao层:
pojo (commons)
pojo SearchResult(别忘序列化)
private long recordCount
private int totalPages;
privaet List itemList;
getters/setters
dao:(search-service)
@Repository
SearchDao public SearchResult search(SolrQuery query)
抛异常
取总数,取商品列表,取高亮
interface:SearchResult search(String keyword, int page, int
rows); 抛异常给表现层!
service:
表现层:/search
keyword page设置默认值 model
get请求出现乱码 表现层手动转码