solr 简单使用

solr 配置

Apache Solr中的主要配置文件如下

  • Solr.xml - 它是包含Solr Cloud相关信息,此文件是在$SOLR_HOME目录中。 为了加载核心,Solr引用这个文件,这有助于识别它们。
  • Solrconfig.xml − 此文件包含与请求处理和响应格式化相关的定义,核心特定配置,以及索引,配置,管理内存和提交。
  • Schema.xml(6.0以后改为) 此文件包含整个模式以及字段和字段类型。
  • Core.properties - 此文件包含特定于核心的配置。它被引用为核心发现,因为它包含核心的名称和数据目录的路径。它可以在任何目录中使用,会将此目录它视为核心目录。

结构

server

该文件夹下放的是solr的一些core,默认情况下,每个core的索引和文档存储都放在这个core下。

core

server目录下的solr目录中存放,目录下即为core存放地方。该目录下的conf目录放置着配置文件managed-schema(这个为配置Filed字段值的文件)以及solrconfig-xml。data目录为index索引目录和数据的地方。

一些概念

  • Document:Solr的信息的基本单位的是Document,它是一组描述某些事物的数据集合。

  • Field:Document的主要构成单元,是更具体的信息描述。可以这样理解,Document对应于我们Java代码中的一个类,而Field,则是类中的一个属性。

  • copyFiled: 当需要查询的关键字在多个filed上出现时,可以使用这个,就相当于搜索博客中标题和内容都带'java'的文章

  • DonlmicFiled 可以使用通配符,如果在filed中没有匹配到字段,这个是最后匹配的

  • Analyzer: 分析器,配置在fieldType,可以包括一个Tokenizer,一个filter.

  • Tokenizer: 分词器,

solr中的一些名词

一条索引包含了

index
Document
Filed
trem

lucene采用的是倒排索引的方式来索引文档的。

SolrJ

  • CoreAdminRequest

    该类主要实现了对core的一些基本操作,如增加、删除一个core,得到状态等等。 此类的静态方法可以很方便的创建一个core

    CoreAdminRequest.createCore(coreName,coreName, solrClient)
    这个方法不是完完整整的创建一个core,作用只是读取未存在solr的core中的两个配置文件然后创建core.properties。 如果在卸载core时候把两个配置文件删除了,是无法恢复的
    CoreAdminRequest.unloadCore(,false,false,)
    中间两个参数为是否删除索引和是否删除文件夹.同时为false只删除core.properties文件。这样可以用上边方法恢复。

Tips

  • SolrQuery,solrResponse

    这两个类属于有比较基本的功能,其他的高级查询可以在这个类上实现,不过取结果是真的恶心

  • SchemaRequest 此类是主要是对schema中字段进行操作,该类有许多内部类,方便对scheme内容操作

  • FileUtils

    solr工具类

solrJ 创建core只是把自己的文件夹加入到solr中,各种文件还要自建立

<field name="5#城市" type="string" indexed="false" stored="true"/>

打分

pf 查询字段 qf 设置字段性对查询字段的比重 bf 设置权重的值

高级查询用法

Grop
Facet

facet.prefix – 限制constaints的前缀

facet.mincount=0 – 限制constants count的最小返回值,默认为0

facet.sort=count – 排序的方式,根据count或者index

facet.offset=0 – 表示在当前排序情况下的偏移,可以做分页

facet.limit=100 – constraints返回的数目

facet.missing=false – 是否返回没有值的field

facet.date – Deprecated, use facet.range

facet.query 指定一个查询字符串作为Facet Constraint

facet.pivot 根据指定维度统计,例如两个参数,即为统计出类似笛卡尔坐标系的结果.

facet.field 要输出的字段,返回结果会包含字段的各个内容的统计值

Searchers are presented with the indexed terms, along with numerical counts of how many matching documents were found were each term. Faceting makes it easy for users to explore search results, narrowing in on exactly the results they are looking for

简单说,solr的facet特性会搜索特定的facet.item,返回query中查询字段在item字段上的统计值且仅仅返回统计数量.
facet.poivt 实现了多维统计.例如统计班级学生的成绩分布,可以设置poivt=class,poivt=socore 返回的结果就是每个班各个成绩段学生的数量
在SolrJ中使用facet功能需要手动开启:query.setFacet(true).然后根据需要query.set(,)添加条件.

代码

facet 简单使用

SolrQuery query = new SolrQuery("sheetId:94");
		query.setFacet(true);
		query.set("facet.field", "city");
		query.add("facet.field", "id");
		query.setFacetMinCount(0);
		query.setRows(0);
		try {
			QueryResponse res = solrClient.query(query);
			List<FacetField> list =res.getFacetFields();
			list.forEach(item->{
				item.getValues().forEach(counts->{
					System.out.println(counts.getName()+":"+counts.getCount());
				});
			});
		} catch (SolrServerException | IOException e) {
			e.printStackTrace();
		}
	
	}
	```
	
SolrClient solrClient = new HttpSolrClient.Builder("http://192.168.0.39:8983/solr/core94").build();
	SolrQuery query = new SolrQuery("sheetId:94");
	query.setFacet(true);
	query.set("facet.pivot", "price");
	query.add("facet.pivot", "city");
	query.setFacetMinCount(2);//
	query.setRows(0);
	try {
		QueryResponse res = solrClient.query(query);
		NamedList<Object> namelist = res.getResponse();

		SolrDocumentList s = (SolrDocumentList) namelist.get("response");
		s.forEach(ss->{
			ss.entrySet().forEach(action->{
				System.out.println(action.getKey()+":"+action.getValue());
			});
			System.out.println("-------");
		});
		List<FacetField> list =res.getFacetFields();
		list.forEach(item->{
			item.getValues().forEach(counts->{
				
				System.out.println(counts);
				
			});
		});
		
		NamedList<List<PivotField>> namelist1 = res.getFacetPivot();
	System.out.println(namelist1);
		if(namelist1!=null) {
			List<PivotField> pivotlist= null;
			for(int i=0;i<namelist1.size();i++) {
				pivotlist =namelist1.getVal(i);
				if(pivotlist !=null) {
					for(PivotField p:pivotlist) {
						//System.out.println(p.getValue());
						List<PivotField> fieldList = p.getPivot();
						if(fieldList!=null) {
							//System.out.println(fieldList);
							for(PivotField pp:fieldList) {
								System.out.println(pp.getValue());
							}
							
						}
					}
				}
			}
		}
	} catch (SolrServerException | IOException e) {
		System.err.println("error");
		e.printStackTrace();
	}
	
	query.setParam(GroupParams.GROUP,true);
	query.setParam(GroupParams.GROUP_FIELD, "city");
	query.setParam(GroupParams.GROUP_LIMIT, "5");
	query.setRows(4);  //设置返回的数量
	try {
		QueryResponse res = solrClient.query(query);
		GroupResponse gres = res.getGroupResponse();
		List<GroupCommand> list= gres.getValues();
	
		list.forEach(item->{
			item.getValues().forEach(i->{
				System.out.println(i.getResult());
			});;
		}); 
	} catch (SolrServerException | IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
```
stats

聚合查询,简单理解就是对stats.field进行一些数学统计,还可以指定facet面进行查询,会在facet字段上的各种结果进行计算.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值