solr配置文件
1. solrConfig.xml : solr核心配置文件
2. schema.xml : solr约束文件
<!--第一种标签为 field标签: 主要是用来指定字段名称的, Lucene中是有用户在程序中指定, solr中需要提前在配置文件中指定-->
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
<!--name: 字段的名称
type: 字段的类型
indexed: 是否索引
stored: 是否保存
multiValued: 是否多值, 这个字段, 类似存储一个数组
这里有两个不允许删除的: 一个是 _version__ 一个是 _root__ 这两个是solr内部需要使用的字段
有一个字段的名称必须为id,其类型都不允许进行修改 原因是id字段已经被主键使用uniqueKey
其余的是一些初始化好的字段
-->
<!--第二种标签为dynamicField, 被称为是动态域 -->
<dynamicField name="*_is" type="int" indexed="true" stored="true" multiValued="true"/>
<!--此种标签是为程序的扩展所使用的, 因为我们不可能把所有的字段全部定义好, 所以就需要动态域来进行动态扩展-->
<!--第三种标签为 uniqueKey: 必要标签, 表名文档的唯一属性, 一般默认为id-->
<uniqueKey>id</uniqueKey>
<!--Lucene中是自己进行维护, solr中, 需要自己指定-->
<!--第四种标签为 copyField: 被称为是复制域-->
<copyField source="cat" dest="text"/>
<!--source: 表名要复制那个字段的值
dest: 复制到那个字段上
此种标签主要是为了查询所使用的,
例如, 当查询Text字段的时候, 实质上相当于查询title和name两个字段-->
<!--第五种标签: fieldType 字段类型定义标签-->
<fieldType name="managed_en" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ManagedStopFilterFactory" managed="english" />
<filter class="solr.ManagedSynonymFilterFactory" managed="english" />
</analyzer>
</fieldType>
<!--此种标签是用来定义字段的类型的,可以指定此字段使用何种分词器进行分词-->
solrj
1. 增
写入document对象
// 写入索引
@Test
public void createIndexToSolr() throws IOException, SolrServerException {
//1. solrj的服务对象
//http://localhost:8080/solr/collection1 连接solr中collection1索引库的接口路径
SolrServer solrServer = new HttpSolrServer("http://localhost:80/solr/collection1");
//2. 添加document文档
SolrInputDocument doc = new SolrInputDocument();
//定义个文档的时候, id字段必须定义, 因为solr是需要程序员自己维护的
doc.addField("id","1");
doc.addField("title","solr是一个企业级的搜索应用服务器");
doc.addField("content","solr是一个独立的企业级搜索应用服务器, 用户可以通过http请求访问这个服务器, 获取或者写入对应的内容, 其底层是Lucene");
solrServer.add(doc);
//3. 提交文档(发送请求的操作)
solrServer.commit();
}
写入javabean
// 使用javaBean添加索引
@Test
public void createIndexJavaBeanToSolr() throws IOException, SolrServerException {
//1. 创建solrj的服务对象
SolrServer solrServer = new HttpSolrServer("http://localhost:80/solr/collection1");
//2. 添加javaBean的信息
Product product = new Product();
product.setId("8");
product.setTitle("壹万贰");
product.setName("iphoneXsMax");
product.setContent("就是有钱, 没办法");
solrServer.addBean(product);
//3. 提交
solrServer.commit();
}
2. 删
// 删除索引
@Test
public void deleteIndexToSolr() throws IOException, SolrServerException {
//1. 创建solrj的服务对象
SolrServer solrServer = new HttpSolrServer("http://localhost:80/solr/collection1");
//2. 执行删除操作
// solrServer.deleteById(" id/ids ");
//条件基本格式: 字段的名称:字段的值
solrServer.deleteByQuery("content:有钱");
//3. 执行提交
solrServer.commit();
}
3. 查
3.1 基本查询
返回document对象
//基本查询入门案例(原生获取document的方式)
@Test
public void queryBaseToSolr() throws SolrServerException {
//1. 创建solr的服务对象
SolrServer solrServer = new HttpSolrServer("http://localhost:80/solr/collection1");
//2. 执行查询的操作
SolrQuery query = new SolrQuery("*:*");
QueryResponse response = solrServer.query(query);
SolrDocumentList documentList = response.getResults();
for (SolrDocument document : documentList) {
Object id = document.get("id");
Object title = document.get("title");
Object content = document.get("content");
System.out.println(id+" "+title+" "+content);
}
}
返回javabean对象
// 查询的基本入门案例(使用javaBean获取结果集) 常用
@Test
public void queryJavaBeanToSolr() throws SolrServerException {
//1. 创建solr的服务对象
SolrServer solrServer = new HttpSolrServer("http://localhost:80/solr/collection1");
//2. 执行查询
SolrQuery query = new SolrQuery("*:*");
QueryResponse response = solrServer.query(query);
//3. 返回javaBean
List<Product> productList = response.getBeans(Product.class);
for (Product product : productList) {
System.out.println(product);
}
}
3.2 复杂查询
在创建SolrQuery时,我们填写的Query语句,可以有以下高级写法:
查询语句中如果有特殊字符,需要转义,可以使用: ” ”
1、匹配所有文档:*😗 (通配符?和 * :“*”表示匹配任意字符;“?”表示匹配出现的位置)
SolrQuery solrQuery = new SolrQuery("content:luce*");
2、布尔操作:AND、OR和NOT布尔操作(推荐使用大写,区分普通字段)
lucene中: MUST NOT SHOULD
SolrQuery solrQuery = new SolrQuery("content:有钱 NOT id:9");
3、子表达式查询(子查询):可以使用“()”构造子查询。 比如:(query1 AND query2) OR (query3 AND query4)
SolrQuery solrQuery = new SolrQuery("(content:lucene OR name:iphone) AND id:[1 TO 2]");
4、相似度查询:
(1)默认相似度查询:title:appla~,此时默认编辑距离是2
(2)指定编辑距离的相似度查询:对模糊查询可以设置编辑距离,可选02的整数:title:appla1。
(3)注意: 如果搜索条件中包含了特殊符号, 需要在条件的两边添加双引号或者单引号
SolrQuery solrQuery = new SolrQuery("content:有钱~1"); //SolrQuery solrQuery = new SolrQuery("content:'lucen~'~");
5、范围查询(Range Query):Lucene支持对数字、日期甚至文本的范围查询,并且两端范围。结束的范围可以使用“*”通配符。
使用格式: [ start TO end ] 包含边界值
(1)日期范围(ISO-8601 时间GMT):birthday:[1990-01-01T00:00:00.000Z TO 1999-12-31T24:59:99.999Z]
(2)数字:age:[2000 TO *]
(3)文本:content:[a TO a] (采用字典顺序)
SolrQuery solrQuery = new SolrQuery("id:[1 TO 3]");
solr高级
//查询的公共的方法
public void baseToSolr(SolrQuery solrQuery) throws SolrServerException {
//1. 创建solr的服务对象
SolrServer solrServer = new HttpSolrServer("http://localhost:80/solr/collection1");
//2. 执行查询:
QueryResponse response = solrServer.query(solrQuery);
//3. 返回javaBean
List<Product> productList = response.getBeans(Product.class);
for (Product product : productList) {
System.out.println(product);
}
}
1. solr排序
@Test
public void sortQueryToSolr() throws SolrServerException {
SolrQuery solrQuery = new SolrQuery("*:*");
//solrQuery.setSort(new SolrQuery.SortClause("id","desc"));
// 参数1 默认排序的字段 参数2 排序的方式
solrQuery.setSort("id", SolrQuery.ORDER.desc);
baseToSolr(solrQuery);
}
2. solr分页
@Test
public void limitQueryToSolr() throws SolrServerException {
int page = 3; //当前页
int pageSize = 3; //每页显示的条数
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.setStart((page-1)*pageSize);
solrQuery.setRows(pageSize);
solrQuery.setSort(new SolrQuery.SortClause("id","desc"));
// 参数1 默认排序的字段 参数2 排序的方式
solrQuery.setSort("id", SolrQuery.ORDER.desc);
baseToSolr(solrQuery);
}
3.solr高亮
// 使用solrj 完成高亮显示
@Test
public void highlighterQueryToSolr() throws SolrServerException {
//1. 创建solrj的服务对象
SolrServer solrServer = new HttpSolrServer("http://localhost:80/solr/collection1");
//2. 执行查询
SolrQuery solrQuery = new SolrQuery("content:有钱");
//高亮参数的设置
solrQuery.setHighlight(true);//开启高亮
solrQuery.addHighlightField("content");//设置高亮的字段,支持添加多个
//solrQuery.addHighlightField("title");
solrQuery.setHighlightSimplePre("<font color='red'>"); //设置高亮标签的前缀
solrQuery.setHighlightSimplePost("</font>"); //设置高亮的后缀
//solrQuery.setHighlightSnippets(Integer.MAX_VALUE); //进行分片高亮 默认为1, 主要针对多值的情况
QueryResponse response = solrServer.query(solrQuery);
//获取高亮的内容:
Map<String, Map<String, List<String>>> map = response.getHighlighting();//获取高亮的结果集
/**
* 最外层的map:
* key: 文档的id值
*
* 内层的map
* key: 高亮的字段
* 内层中list:
* 存放的就是高亮的内容,默认集合中只有一个
*
*/
for (String docId : map.keySet()) {
//System.out.println(docId);
Map<String, List<String>> listMap = map.get(docId);
for (String highlighterField : listMap.keySet()) {
//System.out.println(highlighterField);
List<String> list = listMap.get(highlighterField);//获取到高亮的内容
System.out.println("集合的长度:"+list.size());
System.out.println(highlighterField+" "+list.get(0));
}
}
}