Solr是如何实现全文检索的呢?
索引流程:solr客户端(浏览器、java 程序)可以向solr服务端发送POST请求,请求内容
是包含Field等信息的一个xml文档,通过该文档,solr 实现对索引的维护(增删改)
solr7.7.1整合tomcat8.5.51(windows版本)
https://www.cnblogs.com/aizm/p/10913334.html
solr配置IK分词器:
1.把IK分词器的jar包,放入到tomcat下solr的web-inf目录下的lib目录下,然后把扩展词和停止词和配置文件放入到web-inf下的classes目录下,没有则自己创建
2.在managed-schema文件中配置ik分词器的配置,这个文件一般在你要用的core的conf文件夹下
<!-- ik分词器 -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
solr界面管理
1.删除
xml删除
<delete>
<id>1</id> //删除id为1的
</delete>
<delete>
<query>id:xxxx<query> //删除指定id的,在solr中,id是string类型,*:*表示删除所有
</delete>
更新
想改哪个只要改后面的就行了,solr是先删除,后添加
{"id":"changeme","title":"文章","name":"张三"}
solr导入数据
https://blog.csdn.net/zhou_p/article/details/80839698
solr管理界面查询:
q:查询
fq:过滤查询
fl:域列表,id,product_name,想要哪个域显示出来,就输入哪个
df:默认域
product_price:[* TO 10] 无穷小到10,搜索0-10块钱的东西
product_price:[10 TO *] 10到无穷大 ,中括号表示包含,大括号表示不包含
solrj的基本用法:
package com.xzw.solrj;
import org.apache.http.client.HttpClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
import java.util.List;
import java.util.Map;
/**
* solrJ管理
* 增加
* 修改
* 删除
* 查询
* */
public class SolrJManager {
private final static String solrUrl = new String("http://localhost:8080/solr/");
public static void main(String[] args) {
}
//创建solrserver对象
public HttpSolrClient getHttpSolrClient(){
return new HttpSolrClient.Builder(solrUrl).withConnectionTimeout(1000).withSocketTimeout(6000).build();
}
/**
* 测试solr服务器的添加
* */
@Test
public void testAdd() throws Exception{
//构建一篇文档
SolrInputDocument document = new SolrInputDocument();
//往doc中添加字段
document.setField("id","haha");
document.setField("name","修志武");
//获得一个solr服务器端的请求,选择具体的某一个solr core
HttpSolrClient client = new HttpSolrClient.Builder(solrUrl + "new_core").build();
client.add(document);
client.commit();
client.close();
}
/**
* 根据id从索引库中删除问的文档
* */
@Test
public void testDelete() throws Exception{
HttpSolrClient client = new HttpSolrClient.Builder(solrUrl+"new_core").build();
client.deleteByQuery("*:*",1000);
}
/**
* 更新
* 与添加一致,id相同就是修改,id不同就是添加
* */
@Test
public void testUpdate() throws Exception{
HttpSolrClient client = new HttpSolrClient.Builder(solrUrl+"new_core").build();
//创建一个文档
SolrInputDocument document = new SolrInputDocument();
document.addField("id","haha");
document.addField("name","吴慧敏");
client.add(document);
client.commit();
client.close();
}
/**
* 查询
* */
@Test
public void testQuery()throws Exception{
//获取连接
HttpSolrClient client = new HttpSolrClient.Builder(solrUrl + "new_core").build();
//查询 关键词 台灯 过滤条件 "product_catalog_name":"幽默杂货" "product_price":18.9
SolrQuery query = new SolrQuery();
//设置query查询参数
//关键词
// query.set("q","product_name:台灯");
query.setQuery("台灯"); //设置了默认域
//过滤查询
query.set("fq","product_catalog_name:幽默杂货");
query.set("fq","product_price:[* TO 18.9]");
//按照价格排序
query.addSort("product_price", SolrQuery.ORDER.desc);//降序排序
//分页
query.setStart(0);
query.setRows(5);
//默认域
query.set("df","product_name");
//只查询指定域
query.set("fl","product_name,product_price");
//高亮
//打开高亮开关
query.setHighlight(true);
//指定高亮域
query.addHighlightField("product_name");
//前缀
query.setHighlightSimplePre("<font color='red'>");
//后缀
query.setHighlightSimplePost("</font>");
//获取查询结果
QueryResponse response = client.query(query);
//文档结果集
SolrDocumentList docs = response.getResults();
//总条数
long numFound = docs.getNumFound();
//Map k id v Map
//Map k 域名 v list
//list list.get(0)
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
System.out.println(numFound);
for (SolrDocument doc : docs){
/**
* "product_catalog_name":"幽默杂货",
* "product_price":18.9,
* "product_name":"花儿朵朵彩色金属门后挂 8钩免钉门背挂钩2066",
* "id":"1",
* "product_picture":"2014032613103438.png",
* */
System.out.println("商品标签:"+doc.get("product_catalog_name"));
System.out.println("价格:"+doc.get("product_price"));
System.out.println("产品:"+doc.get("product_name"));
System.out.println("商品编号:"+doc.get("id"));
System.out.println("商品图片:"+doc.get("product_picture"));
System.out.println("寂寞的分割线-------------------------------");
/* Map<String, List<String>> map = highlighting.get(doc.get("id"));
List<String> list = map.get("product_name");
System.out.println(list.get(0));
System.out.println();*/
}
}
}