一丶Solr入门
1.Solr的启动
Solr各版本下载
老版本的时候,需要将war包放到tomcat中,现在只需解压,由于自带jetty容器,可以直接启动
1 [root@aaa bin]# ./solr start -force -p 8983 2 *** [WARN] *** Your open file limit is currently 1024. 3 It should be set to 65000 to avoid operational disruption. 4 If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to 5 false in your profile or solr.in.sh 6 *** [WARN] *** Your Max Processes Limit is currently 15156. 7 It should be set to 65000 to avoid operational disruption. 8 If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to 9 false in your profile or solr.in.sh 10 Waiting up to 180 seconds to see Solr running on port 8982 [/] 11 Started Solr server on port 8982 (pid=4336). Happy searching!
Windos启动:
打开页面发现创建不了Core
官方提供的配置文件在 solr-7.5.0/server/solr/configsets/_default下,将该目录下的conf文件夹放到复制到我们新建的Core(new_core)下,上图所示的test目录在solr-7.5.0/server/solr/new_core,复制过去后,我们再去界面是新建一个test的Core就可以创建
新建完,有这些路径
[root@aaa new_core]# ll total 12 drwxr-xr-x 3 root root 4096 Apr 13 01:23 conf -rw-r--r-- 1 root root 131 Apr 13 01:24 core.properties drwxr-xr-x 5 root root 4096 Apr 13 01:24 data
2.Solr的页面详解
-
Dashboard
-
仪表盘,显示了该Solr实例开始启动运行的时间、版本、系统资源、jvm等信息。
-
-
Logging
-
Solr运行日志信息。
-
-
Core Admin
-
Solr Core的管理界面。在这里可以添加SolrCore实例。
-
-
java properties
-
Solr在JVM 运行环境中的属性信息,包括类路径、文件编码、jvm内存设置等信息。
-
-
Tread Dump
-
显示Solr Server中当前活跃线程信息,同时也可以跟踪线程运行栈信息。
-
-
Core selector (重点)
-
一个SolrCore进行详细操作
-
Analysis(重点)
-
通过此界面可以测试索引分析器和搜索分析器的执行情况。
注:solr中,分析器是绑定在域的类型中的。
-
dataimport
可以定义数据导入处理器,从关系数据库将数据导入到Solr索引库中。
默认没有配置,需要手工配置。注: 后面会提到配置文件
-
Document
通过/update表示更新索引,solr默认根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新。
通过此菜单可以创建索引、更新索引、删除索引等操作,界面如下:
-
<!--l overwrite="true" : solr在做索引的时候,如果文档已经存在,就用xml中的文档进行替换-->
<!--l ommitWithin="1000" : solr 在做索引的时候,每个1000(1秒)毫秒,做一次文档提交。为了方便测试也可以在Document中立即提交,</doc>后添加“<commit/>”-->
-
Query(重点)
-
-
注: 常见的查询条件,链接--> 查询
3.Solr的配置文件
3.1managed-schema
注:以前的旧版本的时候,配置文件叫schema.xml
1 [root@192 conf]# pwd 2 /mnt/solr-7.5.0/server/solr/test_core/conf 3 [root@192 conf]# ll 4 total 132 5 drwxr-xr-x 2 root root 4096 Apr 13 08:24 lang 6 -rw-r--r-- 1 root root 55728 Apr 13 08:59 managed-schema 7 -rw-r--r-- 1 root root 308 Apr 13 08:24 params.json 8 -rw-r--r-- 1 root root 873 Apr 13 08:24 protwords.txt 9 -rw-r--r-- 1 root root 53959 Apr 13 08:24 solrconfig.xml 10 -rw-r--r-- 1 root root 781 Apr 13 08:24 stopwords.txt 11 -rw-r--r-- 1 root root 1124 Apr 13 08:24 synonyms.txt 12 [root@192 conf]#
3.1.1 Filed 定义域
-
Name:指定域的名称 一般映射成表里面的字段
-
Type:指定域的类型
-
Indexed:是否索引
-
Stored:是否存储
-
Required:是否必须
-
multiValued:是否多值,比如商品信息中,一个商品有多张图片,一个Field像存储多个值的话,必须将multiValued设置为true。
3.1.2 dynamicField 动态域
-
Name:指定动态域的命名规则 类型模糊匹配
3.1.3 uniqueKey
-
<uniqueKey>id</uniqueKey>
其中的id是在Field标签中已经定义好的域名,而且该域要设置为required为true。一个配置文件中必须有且仅有一个唯一键。
3.1.4 copyField
-
Source:要复制的源域的域名
Dest:目标域的域名
由dest指的的目标域,必须设置multiValued为true。
3.1.5FiledType
3.1.5 FieldType
-
Name:指定域类型的名称
Class:指定该域类型对应的solr的类型
Analyzer:指定分析器
Type:index、query,分别指定搜索和索引时的分析器
Tokenizer:指定分词器
4.IK分词器
IK下载 密码:igt9。
-
将两个jar包复制到该路径: solr-7.5.0serversolr-webappwebappWEB-INFlib
-
另外将三个配置文件复制到该路径: solr-7.5.0serversolr-webappwebappWEB-INFclasses。如果没有classes文件夹就新建一个。
-
在schema中添加分词器。
1 <!-- 我添加的IK分词 --> 2 <fieldType name="text_ik" class="solr.TextField"> 3 <analyzer type="index"> 4 <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/> 5 </analyzer> 6 <analyzer type="query"> 7 <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/> 8 </analyzer> 9 </fieldType> 10 11 <!-- 继续添加业务域 --> 12 <field name="item_title" type="text_ik" indexed="true" stored="true"/> 13 <field name="item_sell_point" type="text_ik" indexed="true" stored="true"/> 14 <field name="item_price" type="plong" indexed="true" stored="true"/> 15 <field name="item_image" type="string" indexed="false" stored="true" /> 16 <field name="item_category_name" type="string" indexed="true" stored="true" /> 17 <field name="item_desc" type="text_ik" indexed="true" stored="false" /> 18 19 <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> 20 <copyField source="item_title" dest="item_keywords"/> 21 <copyField source="item_sell_point" dest="item_keywords"/> 22 <copyField source="item_category_name" dest="item_keywords"/> 23 <copyField source="item_desc" dest="item_keywords"/>
-
重启Solr。
注:这边没有出来结果,不明白为什么。但是windows版的就成功了
5.Solr简单实用
5.1 根据业务配置filed
1 <!--product--> 2 <field name="product_name" type="text_ik" indexed="true" stored="true"/> 3 <field name="product_catalog" type="string" indexed="true" stored="true"/> 4 <field name="product_catalog_name" type="string" indexed="true" stored="true" /> 5 <field name="product_price" type="pfloat" indexed="true" stored="true"/> 6 <field name="product_description" type="text_ik" indexed="true" stored="false" /> 7 <field name="product_picture" type="string" indexed="false" stored="true" /> 8 <field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
注:现在高本版的int、float要进一个p字母
5.2引入jar包
-
Mysql的驱动包
-
-
把这3个jar包拷贝到 solrserversolr-webappwebappWEB-INFlib 下
5.3solrconfig.xml文件配置
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler> 在第一个requestHandler下面,加入这段。
5.4创建data-config.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/solr" user="root" password="root"/> <document> <entity name="product" query="SELECT pid,name,catalog,catalog_name,price,description,picture FROM products "> <field column="pid" name="id"/> <field column="name" name="product_name"/> <field column="catalog" name="product_catalog"/> <field column="catalog_name" name="product_catalog_name"/> <field column="price" name="product_price"/> <field column="description" name="product_description"/> <field column="picture" name="product_picture"/> </entity> </document> </dataConfig>
-
dataSource不多说,一看就明白
-
entity --代表数据库表
-
column--代表数据库表字段
-
name--代表solr中字段名
5.5重启Solr
导入数据。
6.Solrj的使用
6.1查询
@Test public void search01() throws Exception { // 创建HttpSolrServer HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/test_core"); // 创建SolrQuery对象 SolrQuery query = new SolrQuery(); // 输入查询条件 query.setQuery("product_name:小黄人"); // 执行查询并返回结果 QueryResponse response = server.query(query); // 获取匹配的所有结果 SolrDocumentList list = response.getResults(); // 匹配结果总数 long count = list.getNumFound(); System.out.println("匹配结果总数:" + count); for (SolrDocument doc : list) { System.out.println(doc.get("id")); System.out.println(doc.get("product_name")); System.out.println(doc.get("product_catalog")); System.out.println(doc.get("product_price")); System.out.println(doc.get("product_picture")); System.out.println("====================="); } } -- 注:URL那里要加上那个core,不然会报错,之前研究4.xx版本的时候,没有这个问题
查询结果: 匹配结果总数:122 4403 家天下小黄人美耐瓷卡通儿童筷-黄色筷子 47 5.5 2014032515340838.png ===================== 4404 家天下小黄人美耐瓷卡通儿童筷-蓝色筷子 47 5.5 2014032515284014.png ===================== 3 神偷奶爸电影同款 惨叫发泄公仔 发声小黄人 17 10.0 2014032417271233.png ===================== 4 神偷奶爸电影同款 发泄公仔 暴眼小黄人 17 13.0 2014032416533215.png ===================== 2054 家天下高保真翻开书页创意小音箱便携小音响SL23 28 18.0 2011120313192588_S.jpg ===================== 125 迷你随身小扑克CL-1902 17 3.0 2011042711514296.jpg ===================== 895 家天下南韩小夹子黑板 20 0.93 2009110217233545.jpg ===================== 1941 家天下法式小酒桶打火机 25 6.8 2011041917513362_S.jpg ===================== 3199 好酷仔迷你小风扇 30 7.5 2013041714005875_S.jpg ===================== 195 家天下小酒窝青蛙情侣挂钩 17 3.2 2009080314562507.jpg =====================
6.2复杂查询
1 @Test 2 public void search02() throws Exception { 3 // 创建HttpSolrServer 4 HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/test_core"); 5 // 创建SolrQuery对象 6 SolrQuery query = new SolrQuery(); 7 8 // 输入查询条件 9 query.setQuery("product_name:小黄人"); 10 // query.set("q", "product_name:小黄人"); 11 12 // 设置过滤条件 13 // 如果设置多个过滤条件的话,需要使用query.addFilterQuery(fq) 14 query.setFilterQueries("product_price:[1 TO 10]"); 15 16 // 设置排序 17 query.setSort("product_price", ORDER.asc); 18 // 设置分页信息(使用默认的) 19 query.setStart(0); 20 query.setRows(5); 21 22 // 设置显示的Field的域集合 23 query.setFields("id,product_name,product_catalog,product_price,product_picture"); 24 25 // 设置默认域 26 query.set("df", "product_keywords"); 27 28 // 设置高亮信息 29 query.setHighlight(true); 30 query.addHighlightField("product_name"); 31 query.setHighlightSimplePre("<em>"); 32 query.setHighlightSimplePost("</em>"); 33 34 // 执行查询并返回结果 35 QueryResponse response = server.query(query); 36 // 获取匹配的所有结果 37 SolrDocumentList list = response.getResults(); 38 // 匹配结果总数 39 long count = list.getNumFound(); 40 System.out.println("匹配结果总数:" + count); 41 42 // 获取高亮显示信息 43 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); 44 for (SolrDocument doc : list) { 45 System.out.println(doc.get("id")); 46 47 List<String> list2 = highlighting.get(doc.get("id")).get("product_name"); 48 if (list2 != null) 49 System.out.println("高亮显示的商品名称:" + list2.get(0)); 50 else { 51 System.out.println(doc.get("product_name")); 52 } 53 54 System.out.println(doc.get("product_catalog")); 55 System.out.println(doc.get("product_price")); 56 System.out.println(doc.get("product_picture")); 57 System.out.println("====================="); 58 } 59 } 60
匹配结果总数:81 3741 高亮显示的商品名称:家天下正品达贺纤长睫毛<em>小</em>帮手1029立体水晶睫毛卡 33 1.15 20080816114400873.jpg ===================== 862 高亮显示的商品名称:家天下南韩<em>小</em>夹子黑板新版 20 1.5 2011071109133007_S.jpg ===================== 4675 高亮显示的商品名称:家天下甜心柄美耐瓷<em>小</em>汤勺1105-粉 47 1.6 2010011214065760.jpg ===================== 4676 高亮显示的商品名称:家天下甜心柄美耐瓷<em>小</em>汤勺1105-蓝 47 1.6 2010011214062611.jpg ===================== 4677 高亮显示的商品名称:家天下甜心柄美耐瓷<em>小</em>汤勺1105-绿 47 1.6 2010011214045423.jpg =====================
6.3增加索引
1 @Test 2 public void insertAndUpdateIndex() throws Exception { 3 // 创建HttpSolrServer 4 HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/test_core"); 5 // 创建Document对象 6 SolrInputDocument doc = new SolrInputDocument(); 7 doc.addField("id", "c001"); 8 doc.addField("name", "solr test111"); 9 // 将Document对象添加到索引库 10 server.add(doc); 11 // 提交 12 server.commit(); 13 } 14 { 15 "responseHeader":{ 16 "status":0, 17 "QTime":8, 18 "params":{ 19 "q":"name:solr test111", 20 "_":"1555242778361"}}, 21 "response":{"numFound":1,"start":0,"docs":[ 22 { 23 "id":"c001", 24 "name":["solr test111"], 25 "_version_":1630790213324242944}] 26 }}
6.4删除索引
1 @Test 2 public void deleteIndex() throws Exception { 3 // 创建HttpSolrServer 4 HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/test_core"); 5 6 // 根据指定的ID删除索引 7 // server.deleteById("c001"); 8 9 // 根据条件删除 10 server.deleteByQuery("id:c001"); 11 12 // 删除全部(慎用) 13 // server.deleteByQuery("*:*"); 14 15 // 提交 16 server.commit(); 17 }
已经被删除,就找不到了
附:Solr查询用法
-
q - 查询关键字,必须的,如果查询所有使用:。
请求的q是字符串
-
fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如::
请求fq是一个数组(多个值)
过滤查询价格从1到20的记录。也可以在“q”查询条件中使用product_price:[1 TO 20],如下:
也可以使用“*”表示无限,例如:
20以上:product_price:[20 TO *]
20以下:product_price:[* TO 20]
-
sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:
按价格降序
-
start - 分页显示使用,开始记录下标,从0开始
-
rows - 指定返回结果最多有多少条记录,配合start来实现分页。
实际开发时,知道当前页码和每页显示的个数最后求出开始下标。
-
fl - 指定返回那些字段内容,用逗号或空格分隔多个。
显示商品图片、商品名称、商品价格
-
df-指定一个搜索Field
也可以在SolrCore目录 中conf/solrconfig.xml文件中指定默认搜索Field,指定后就可以直接在“q”查询条件中输入关键字。
-
wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
-