正式开启企业级的全文检索引擎Solr的学习之路,从官网http://lucene.apache.org/solr/ 下载的是6.2.1版本,需要1.8版本的JDK支持,Solr内置了Jetty服务器,可以直接启动服务。
文章目录
启动Solr
解压Solr,然后到bin目录下启动Solr,命令:solr start -e cloud -noprompt
默认端口启动,配置文件【solr-6.2.1\server\etc\jetty-http.xml】可改监听端口,效果如图所示:
Solr会部署两个节点:8983和7574端口,算是单机版分布式Solr。启动后访问:http://localhost:8983/solr/
,看下两个节点的结构图:
配置Core
直接solr start
启动独立模式,启动Solr后创建索引库:solr create -c wenqy -d basic_configs
,创建名称为“wenqy”的Core,效果如图:
修改schama配置
下面为示例文件【solr-6.2.1\example\exampledocs\books.csv】建立索引。
修改【solr-6.2.1\server\solr\wenqy\conf\managed-schema】schema文件,为关键字段作索引。还有些是dynamicField动态字段,如图所示:
修改配置后重启Solr,停止:solr stop -all
,启动:solr start
。
Solr对外提供标准http接口来实现对数据索引的CRUD操作。在 Solr 中,用户通过向部署的 Solr 应用程序发送 HTTP 请求来启动索引和搜索。Solr 接受请求,使用相应的SolrRequestHandler,然后处理请求。通过 HTTP 以同样的方式返回响应。默认配置返回Solr 的标准 XML 响应,也可以配置Solr 的其他响应格式,如json等。
索引数据
Apache Solr自带SimplePostTool独立的Java程序,打包成Jar包。在【solr-6.2.1\example\exampledocs】目录下,可先查看帮助:java -jar post.jar -h
,发起命令创建索引:java -Dtype=text/csv -Durl=http://localhost:8983/solr/wenqy/update -jar post.jar books.csv
为示例文件“book.csv”做索引。还支持各种文件类型的数据。
查询索引文档
Apache Solr提供了一种基于REST API来访问的数据,并还提供了不同的参数,以检索数据。
按名称搜索,URL中的参数“q”是查询事件。打开浏览器下列URL:http://localhost:8983/solr/wenqy/select?q=name:"Foundation"
,查询名称为“Foundation”的索引数据,响应结果如图:
可以直接输入首字母,进行首字母检索。亦可以利用通配符检索,如:*。支持条件的搜索。我们可以设置条件,我们的查询提供了“fq”参数。如,查询价格低于6且名称包含“of”的书籍。
http://localhost:8983/solr/wenqy/select?q=name:"*of"&fq=price:[0 TO 6]
用浏览器Solr控制台查询,返回json格式的数据:
具体查询语法,可查看附录链接。Solr提供了不同语言的客户端API,如面向Java的SolrJ
集成Tomcat容器
当然,也可以将它集成到Tomcat等容器下。
将【solr-6.2.1\server\solr-webapp】目录下的webapp重命名后,放到Tomcat的webapps应用目录下,我将它重命名为solr,如图:
将【solr-6.2.1\server\lib\ext】下的所有jar包拷贝到Tomcat的【webapps\solr\WEB-INF\lib】目录下;将【solr-6.2.1\server\resources】下的log4j.properties配置文件拷贝到Tomcat的【webapps\solr\WEB-INF\classes】,如果WEB-INF下没有classes文件那么就创建一个classes文件夹,这是为了日志处理模块正常工作;在Tomcat的【webapps\solr】下新建一个目录solrhome(文件夹名称可以任意命名),将【solr-6.2.1\server\solr】下的所有文件拷贝到刚刚创建的solrhome中。
修改Tomcat的【webapps\solr\WEB-INF】下的web.xml,将路径改成solrhome的路径,如图:
运行Tomcat,运行成功后访问:http://localhost:8080/solr/index.html ,结果竟然报错。
查看Tomcat启动错误日志:Caused by: java.lang.IllegalArgumentException: The main resource set specified [D:\tomcat8.0.24\webapps\项目] is not valid
,原来自己加了上下文默认应用,自己删了应用,而配置忘删了。找到原因
删了应用后,Tomcat启动,结果显示无法显示。后面一找,原来先前把端口改成了7080:
最后面终于运行成功,进入控制台:
配置Core
solrhome目录下的【configsets\basic_configs】文件夹复制到solrhome目录下,重命名为core1
在浏览器中,选择【core admin】进行索引库管理,点击add core,输入刚才重命名的目录名。如图:
solrconfig.xml 和 managed-schema 两个文件在 solrhome的【core1\conf】 中。
如果需要DIH(Data Import Handler,example-DIH演示了如何从hsql数据库导入数据到solr中)服务,还需要添加DIH相关的包和和数据库对应的jdbc相关包。
solr-dataimporthandler.jar和solr-dataimporthandler-extras.jar 在【solr-6.2.1\dist】目录中可找到。
SolrJ 测试
用上面创建“wenqy”的Core为例,“book.csv”做索引数据后,有10个doc,查看统计,如图:
导入Solr相关的lib包后,进行编码测试添加索引:
- public class AddCoreTest {
- private static final String URL=“http://localhost:8983/solr/wenqy”;
- private static HttpSolrClient solrClient = null;
- public static void main(String[] args) {
- AddCoreTest search = new AddCoreTest();
- search.init();
- search.addData();
- }
- private void init() {
- solrClient = new HttpSolrClient.Builder(URL).build();
- solrClient.setConnectionTimeout(3000);
- }
- public void addData() {
- // Map<String, SolrInputField> filedMap = new HashMap<String, SolrInputField>();
- // SolrInputField fa = new SolrInputField(“id”);
- // fa.addValue(“20160928”, 1);
- // SolrInputField fb = new SolrInputField(“name”);
- // fb.addValue(“小温之家”, 2);
- // filedMap.put(“id”, fa);
- // filedMap.put(“name”, fb);
- // SolrInputDocument doc = new SolrInputDocument(filedMap);
- SolrInputDocument doc = new SolrInputDocument();
- try {
- // 字段和类型要与schema.xml配置文件里的相对应
- //solrClient.deleteById(“id”);
- doc.addField(“id”, “20160928”);
- doc.addField(“cat”, “book”);
- doc.addField(“name”, “小温之家-solr学习之路”);
- doc.addField(“price”, “9.99”);
- doc.addField(“author”, “wenqy”);
- doc.addField(“inStock”, true);
- UpdateResponse response = solrClient.add(doc);
- solrClient.commit();
- System.out.println(response);
- } catch (SolrServerException e) {
- e.printStackTrace();
- } catch (IOException e) {
- System.out.println(e);
- }
- }
- }
用solrj添加索引数据后,doc总数为11,增加了一个,用q搜索“name:小温之家”,得到刚才添加的结果。
万事到底是不是开头难,我不知道,坚持的才是神位吧,勉励。。。
附录
查询语法wiki简介:http://wiki.apache.org/solr/SolrQuerySyntax
官网查询语法:https://cwiki.apache.org/confluence/display/solr/Query+Syntax+and+Parsing
pdf官方文档下载:https://www.apache.org/dyn/closer.cgi/lucene/solr/ref-guide/
SOLR使用手册之查询语法: http://haiziwoainixx.iteye.com/blog/2095599
linux版本快速构建: http://lucene.apache.org/solr/quickstart.html
2 人论剑于 “Solr学习之路–1环境集成搭建”