1.lucence:jar包 组成组件 它不是一套完整搜索引擎服务,他里面提供了很多
一些概念方面的抽象,是没有具体实现
2.solr是一种全文搜索引擎,是一套完整的企业级分布式搜索和搜索引擎
是一个企业级,电商平台全文搜索。
国内知名电商平台搜索各种数据 nosql,数据变化不大不像附近人在变,毕竟固定。
全文检索
命中表示
分页搜索
动态聚类
数据集成
富文本处理
高扩展
3.es是一种基于lucence的搜索引擎,他和solr区别在于,solr是对已有
各种数据的检索非常稳定高效,es主要是在做实时搜索,搜索的数据量可能随便
变化,他是比solr效率高
es像一些社交软件 随时搜索附近的人
一.下载获取solr 构建我们自己solr搜索平台
http://archive.apache.org/dist/lucene/solr
solr-4.10.3.zip windows
solr-4.10.3.tgz linux
二.solr服务整体结构
http://www.cnblogs.com/HD/p/3977799.html
2.1 运行war
solr-4.10.3/example/webapps/solr.war 在tomcat下webapp运行启动war包,获取solr文件
2.2 配置web.xml
回到tomcat的webapps目录下,记事本打开solr\WEB-INF\web.xml文件。
加入如下代码:在<web-app />节点内的最后。
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/usr/local/solr-entry/solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
2.3 配置solrhome文件
solr-4.10.3\example\solr,复制所有内容到 solr配置模块 /usr/local/solr-entry/solrhome
2.4 拷贝jar包
打开文件夹:solr-4.10.3\example\lib\ext,复制所有jar包到 tomcat的solr项目下 的webapps\solr\WEB-INF\lib下。
2.5 运行 solr服务平台
localhost:8081/solr/
三.我们用solr分词(IKAnalyzer中文分词器)
分词前要有jar包支持:ik分词插件,
IKAnalyzer2012FF_u1.jar可扩展的插件
用来分词的工具包,这个工具包有支持lucene的接口,所以用它来做分词,分词汉语一句话根据主谓宾智能判断出来。
3.1.IKAnalyzer2012FF_u1.jar 包放到 [b]tomcat的solr项目下 tomcat/webaaps/solr/WEB-INF/lib/IKAnalyzer2012FF_u1.jar [/b] 注:IKAnalyzer2012_u6.jar或其他版本会有问题。
3.2.检索配置文件
ex_stopword.dic 中文词库
IKAnalyzer.cfg.xml 扩展配置文件
mydict.dic 中文词语库
以上三个文件网上下载后放到如下路径
tomcat/webaaps/solr/WEB-INF/classes/
3.3 配置solrhome配置模块,修改schema.xml文件
与其它分词器的配置大体相同,在<types></types>配置项间加一段如下配置:
<!-- 配置中文分词器fieldType TextField和lucene是不一样的 --> <fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>
最后就可以使用text_ik了
<!-- 配置中文分词Field --> <field name="hailong_name" type="text_ik" indexed="true" stored="true" /> <field name="product_name" type="text_ik" indexed="true" stored="true" />
另:solr默认分词器
<!-- A general text field that has reasonable, generic cross-language defaults: it tokenizes with StandardTokenizer, removes stop words from case-insensitive "stopwords.txt" (empty by default), and down cases. At query time only, it also applies synonyms. --> <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <!-- in this example, we will only use synonyms at query time <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> --> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
智能分词 像人一样智能判断一条语句的主谓宾
我喜欢白富美 =>我|喜欢|白|富|美
经常更新词库
大数据云计算:洞悉先机(每一个人的心里喜好都有被某知名电商平台分析过,只要是他们的会员)
大数据企业 索引(直接拥有)
四.solr与电商
电商平台用solr全文检索 模块
简单介绍
a.简单检索
页面检索:
java solrj客户端检索
b.复杂检索
简单检索:
Dataimport这个功能 将数据库solr的电商数据 全部solr索引到我们的真实数据库。
Dataimport功能各种类型的数据 映射 到我们的服务solr。
索引(直接拥有数据的地址)里面id,查询非常
数据库的数据不是存在solr服务里,
4.1 建立映射
4.1.1 添加jar包到tomcat的solr项目
solr-4.10.3/dist/solr-dataimporthandler-4.10.3.jar 引入到solr服务中:
加入到apache-tomcat\webapps\solr\WEB-INF\lib
4.1.2 配置solrconfig.xml(配置dataimport handler)
<!-- add by hailong 20170308 --> <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <!-- <str name="config">/usr/local/solr-entry/solrhome/conllection1/conf/mysql-data-config.xml</str>--> <!-- 放在同一个目录下 --> <str name="config">mysql-data-config.xml</str> </lst> </requestHandler>
以上代码配置加入到 /usr/local/solr-entry/solrhome/conllection1/conf/solrconfig.xml
添加位置根据自己的习惯,便于查找即可,我这里放到系统内置最后一个handler,replication之下。
注:solrconfig.xml 还需要mysql-connector-java-5.1.36.jar驱动包
4.1.3 添加mysql-data-config.xml文件(配置数据源)
添加mysql-data-config.xml文件,映射到数据库
<?xml version="1.0" encoding="UTF-8" ?> <dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.92.129:3306/solr_test" user="root" password="123456"/> <document> <entity name="product" transformer="HTMLStripTransformer" query="SELECT pid, product_name, catalog_name, product_price, product_description, product_picture FROM product"> <field column="pid" name="id" /> <field column="product_name" name="product_name" /> <field column="catalog_name" name="catalog_name" /> <field column="product_price" name="product_price" /> <field column="product_description" name="description" /> <field column="product_picture" name="product_picture" /> </entity> </document> </dataConfig>
dataSource节点配置:
name: dataSource的名称,配置文件可以有多个datasource,使用name区分。
type:数据源类型,如JDBC
driver:数据库驱动包,去提前放到lib目录下
url:数据库连接url
<field>字段配置:
column:数据库查询列名称
name:Schema.xml中的字段
文件位置:
column与name对应
注:product_name作为搜索字段,需要设定type="text_ik",不然做不到分词查询。
4.1.4 修改schema.xml文件(配置数据源)
添加field name属性,此属性对应mysql-data-config.xml的<field name的值 :
以上配置完成
4.1.5 执行创建索引
再次启动solr:
启动成功,把mysql创建索引到doc文件:
查询doc:
取得的是mysql的数据:
以上配置完成,可以结合spring java代码实现电商plp商品列表加载solr索引信息了。
4.1.6 配置solr日志
有些问题在tomcat无法打印出日志,不方便查出原因,配置solr日志,可查找solr出的问题:
在tomcat的solr工程下添加日志属性文件
# Logging level log4j.rootLogger=WARN, file #- size rotation with log cleanup. log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.MaxFileSize=4MB log4j.appender.file.MaxBackupIndex=9 #- File to log to and log format log4j.appender.file.File=logs/solr.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n
在tomcat/webapps/solr/WEB-INF/lib 下查看之前导入过的日志jar包:
运行后出现日志文件 tomcat/bin/logs/solr.log:
可能出现错误:
org.apache.solr.common.SolrException: Document is missing mandatory uniqueKey field: id
在solr建立索引的时候,如果你提交的doc中没有 id 这个Field,结果Solr在建立索引时候出现如下错误:
org.apache.solr.common.SolrException: Document [null] missing required field: id
主要是因为Solr 的solrconfig配置文件中定义了<uniqueKey>id</uniqueKey>,默认了ID 是唯一的。
如果你的索引字段不需要ID,就可以把这个改掉.
<uniqueKey>kwid</uniqueKey>
并将id字段里的required="true"属相,
添加到kwid字段。
<field name="pid" type="string" indexed="true" stored="true" required="true"/>
其他细节:
组合域
多域组合查询
明细化控制
命中表示
动态聚类
富文本处理
数据集成
web应用使用solr总体思路: java服务器映射到solr服务(httpSolrServer),solr的web.xml映射到entry solrhome实体数据(实体配置模块),solr实体数据映射数据库。
电商中应用:分页,返回plp对象list,且设置好高亮显示。
参考:
属性定义 http://www.cnblogs.com/rainbowzc/p/3695058.html
结合solr服务实现搜索引擎的java代码
http://572327713.iteye.com/blog/2360936
http://www.cnblogs.com/easong/p/6258280.html
http://www.w2bc.com/article/204862