Solr学习之三:Solr各种查询实例
文档里的查询实例可以应对一些普通的solr查询,复杂的solr查询还得自己再继续添加代码,自己也在学习中。先贴出完整代码,后再做说明。
注意:在运行如下查询实例前你得先向solr Admin中添加了你要查询的内容并且你所查询的字段(如id、name、content等)在schema.xml中已被定义。
l 代码如下:
package mysolrtest;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
public classQueryTest {
static String url = "http://10.7.11.141:8080/solr";
static SolrServer solr = new HttpSolrServer(url);
public static void main(String[]arguments) throws SolrServerException{
QueryTesttest = newQueryTest();
test.solrOrder();
test.likeQuery();
test.pageQuery();
test.multipleQueryAND();
test.multipleQueryOR();
test.multipleQueryNOT();
}
//排序查询
public void solrOrder() throws SolrServerException{
SolrQueryquery = newSolrQuery();
query.setQuery("*:*"); //查询所有索引
query.addSortField("id",SolrQuery.ORDER.asc); //按id升序排列
QueryResponsersp = solr.query(query);
SolrDocumentListlist = rsp.getResults();
for (int i = 0; i <list.size(); i++){
//显示查询到的所有字段及字段内容
System.out.println(list.get(i));
//显示查询到的特定字段内容,下面几个函数也可这样显示
SolrDocumentdoc = list.get(i);
System.out.println(doc.get("id") + " " + doc.get("name") +
" " + doc.get("interest")+ " "+ doc.get("dream"));
}
}
//模糊查询
public void likeQuery() throws SolrServerException{
SolrQueryquery = newSolrQuery();
query.setQuery("name:*xiaomutou*");//查询name中含有xiaomutou字样的索引
QueryResponsersp = solr.query(query);
SolrDocumentListlist = rsp.getResults();
for (int i = 0; i <list.size(); i++){
System.out.println(list.get(i));
}
}
//分页查询
public void pageQuery() throws SolrServerException{
SolrQueryquery = new SolrQuery();
query.setQuery("*:*");
query.setStart(5);//当设置为5时,表示从第6记录取,默认取值为0,就是从第1条开始取
query.setRows(5);//表示取出的记录数,默认是10条
QueryResponsersp = solr.query(query);
SolrDocumentListlist = rsp.getResults();
for (int i = 0; i <list.size(); i++){
System.out.println(list.get(i));
}
}
//多条件AND(并且)的情况
public void multipleQueryAND() throws SolrServerException{
//之前下行语句是在函数外面定义的(上面3个函数也是),如此就会出现覆盖情况
SolrQuery query = new SolrQuery();
// query.setQuery("name:*xiaomutou*");
// query.setFilterQueries("dream:*");//过滤查询,即除上面的条件还需满足有字段dream
//可以用下行语句代替前面两行语句。(注意:AND必须大写,可以用“&&”代替,如果是小写则
//结果并非我们所预期的。我的理解是and并不是多条件查询关键字,如是and编译器则理解成
//是and字段,而空格相当于多条件OR,所以就相当于是OR查询了)
query.setQuery("name:*xiaomutou* ANDdream:*");
//取id、name和dream字段。也可这样写query.setFields("id", "name","dream")
query.setFields("id, name, dream");
QueryResponsersp = solr.query(query);
SolrDocumentListlist = rsp.getResults();
// System.out.println(list.size());//输出符合条件的list个数
for (int i = 0; i < list.size();i++){
System.out.println(list.get(i));
}
}
//多条件OR(或者)的情况
public void multipleQueryOR() throws SolrServerException{
SolrQueryquery = newSolrQuery();
query.setQuery("name:*datou* OR content:*"); //OR必须大写或用“空格”、“||”代替
query.setFields("id, name, content");
QueryResponsersp = solr.query(query);
SolrDocumentListlist = rsp.getResults();
for (int i = 0; i <list.size(); i++){
System.out.println(list.get(i));
}
}
//多条件NOT(非)的情况
public void multipleQueryNOT() throws SolrServerException{
SolrQueryquery = newSolrQuery();
//NOT必须大写或用“-”、“!”代替,并且“-”或者“!”必须紧跟content,中间不能有空格
query.setQuery("name:*datou* NOTcontent:stick");
query.setFields("id, name, content");
QueryResponsersp = solr.query(query);
SolrDocumentListlist = rsp.getResults();
for (int i = 0; i <list.size(); i++){
System.out.println(list.get(i));
}
}
}
l 说明如下:
1. 排序查询
使用addSortField方法可将查询出来的结果按照你指定的字段进行排序。单独运行排序查询结果如下:
(小技巧:可以选中你想注释的代码行按ctrl+7注释掉,取消注释也是如此)
SolrDocument{id=1, name=xiaomutou,sex=female, interest=[Reading travelling watching and singing!],_version_=1462269635528228864}
1 xiaomutou [Reading travellingwatching and singing!] null
SolrDocument{id=2, name=datou,sex=male, interest=[Travelling singsing and learning!], _version_=1462269635557588992}
2 datou [Travelling singsing andlearning!] null
SolrDocument{id=3, name=gufeng,age=22, dream=[Having a beautiful life!], _version_=1462269635558637568}
3 gufeng null [Having a beautifullife!]
SolrDocument{id=4, name=shanyin,age=23, dream=[Giving pengpeng a beautiful life!],_version_=1462269635559686144}
4 shanyin null [Giving pengpeng abeautiful life!]
SolrDocument{id=5, name=jiankang,content=[I just need health!], _version_=1462269635560734720}
5 jiankang null null
SolrDocument{id=6, name=pingan,age=24, content=[I just need safety!], _version_=1462269635560734721}
6 pingan null null
SolrDocument{id=7,name=datouxiaomutou, sex=male, age=23, interest=[Travelling singsing readingwatching and learning!], dream=[Having a beautiful life, travelling around theworld and giving pengpeng a beautiful life!], content=[I will stick to my dreamand strive it throught my life!], _version_=1462269635561783296}
7 datouxiaomutou [Travelling singsing readingwatching and learning!] [Having a beautiful life, travelling around the worldand giving pengpeng a beautiful life!]
2. 模糊查询
模糊查询其实很简单,因为solr本身就支持正则查询,所以通过setQuery指定你要查询的字段,以及要做模糊查询的值就搞定了。单独运行模糊查询结果如下:
SolrDocument{id=1, name=xiaomutou,sex=female, interest=[Reading travelling watching and singing!],_version_=1462269635528228864}
SolrDocument{id=7,name=datouxiaomutou,sex=male,age=23,interest=[Travellingsingsing reading watching and learning!], dream=[Having a beautiful life,travelling around the world and giving pengpeng a beautiful life!], content=[Iwill stick to my dream and strive it throught my life!],_version_=1462269635561783296}
3.分页查询
这里用到了setStart以及setRows方法进行分页,其用法见代码注释。单独运行分页查询结果如下:(说明:因为setStart(5)参数设为5,所以结果从第6条记录开始输出)
SolrDocument{id=6, name=pingan,age=24, content=[I just need safety!], _version_=1462269635560734721}
SolrDocument{id=7,name=datouxiaomutou,sex=male,age=23,interest=[Travellingsingsing reading watching and learning!], dream=[Having a beautiful life,travelling around the world and giving pengpeng a beautiful life!], content=[Iwill stick to my dream and strive it throught my life!],_version_=1462269635561783296}
4.多条件查询
多条件查询AND、OR和NOT情况类似,具体用法见代码注释。单独运行多条件查询结果如下:
SolrDocument{id=7,name=datouxiaomutou, dream=[Having a beautiful life, travelling around theworld and giving pengpeng a beautiful life!]}
(AND查询结果如上)
SolrDocument{id=7,name=datouxiaomutou, content=[I will stick to my dream and strive it throughtmy life!]}
SolrDocument{id=2, name=datou}
SolrDocument{id=5, name=jiankang,content=[I just need health!]}
SolrDocument{id=6, name=pingan,content=[I just need safety!]}
(OR查询结果如上,优先输出同时满足多个条件的,在这里即为id=7索引内容)
SolrDocument{id=2, name=datou}
(NOT查询结果如上)
备注:在多条件查询NOT这里,运行结果起初没有达到自己所想要的(自己想只输出id=2索引内容,而之前把id=7索引内容也一起输出了),为了解决这个问题,自己网上找了一下午的资料都没解决,我以为自己没有理解AND、OR和NOT的语法。最后找老师帮忙看是哪里出错了,一起和老师调试程序并网上查资料弄了差不多也有一小时吧,终于找到了问题的根本,原来是content字段没被索引,即在schema.xml中把content字段中的index设置成了false,将其改为true即可 (注意:要在 tomcat 目录下修改 schema.xml< 记得保存 > 重启 tomcat 再重新添加索引内容到 solr Admin 中才行,在 solr 下修改 schema.xml 没有)。
Solr学习之三:Solr各种查询实例相关推荐
- 【SQL Server】系统学习之三:逻辑查询处理阶段-六段式
一.From阶段 针对连接说明: 1.笛卡尔积 2.on筛选器 插播:unknown=not unknuwn 缺失的值: 筛选器(on where having)把unknown当做FALSE处理,排 ...
- oracle学习之三--多表查询
一.在oracle中存在这样几种表的连接方式: 1.等值连接:连接2张表其中有相同的字段 2.不等值连接 3.外连接:当条件不成立时,某些记录仍然显示 4.自连接:自己和自己连接 对与不等值的连接如: ...
- Solr学习总结(四)Solr查询参数
今天还是不会涉及到.Net和数据库操作,主要还是总结Solr 的查询参数,还是那句话,只有先明白了solr的基础内容和查询语法,后续学习solr 的C#和数据库操作,都是水到渠成的事.这里先列出sol ...
- java商品搜索功能_利用solr实现商品的搜索功能(实例讲解)
后期补充: 为什么要用solr服务,为什么要用luncence? 问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据不可 ...
- Solr学习总结(一)Solr介绍
最近一直在搞Solr的问题,研究Solr 的优化,搜索引擎的bug修改等,这几天终于有时间,闲下来总结分享,以便大家参考,与大家一起来共同学习. Solr是一个基于Lucene的全文搜索引擎,同 ...
- Solr学习总结(1)——Apache Solr快速入门
Apache Solr支持不同格式,例如数据库,PDF文件,XML文件,CSV文件. 为什么选择Apache Solr Apache Solr是搜索服务器,提供REST风格API. Solr基于Luc ...
- Solr学习 DIH增量、定时导入并检索数据
(一)引言: 前面我的文章 DIH全量导入 中已经学会了如何全量导入Oralce和MySQL的数据,大家都知道全量导入在数据量大的时候代价非常大,一般来说都会适用增量的方式来导入数据,下面介绍如何增量 ...
- 基于Solr的HBase多条件查询测试
背景: 某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询.HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力.针对HBase ...
- [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.
为了更好的排版, 所以将IK分词器的安装重启了一篇博文, 大家可以接上solr的安装一同查看. [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一: http://w ...
最新文章
- 除了负载均衡,Nginx 还可以做很多:限流、缓存、黑白名单等
- python软件开发-Python
- python自动轨迹绘制_Python——自动轨迹绘制
- Puppet dashboard安装
- FreeRTOS 之二 Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)
- PowerBI分析Exchange服务器IIS运行日志
- pycon视频_观看6个PyCon 2015社区相关视频
- 隐式连接时,windows下VS(包括2005、2008等)下配置OpenCV动态库的步骤
- oracle用户密码规则,使用Oracle自带profile以及函数简单设定Oracle用户名密码规则...
- HDU4506 小明系列故事——师兄帮帮忙【水题】
- Extjs6 自定义事件
- linux日志过大怎么查看,Linux查看日志常用命令
- 应届生毕业第一份工资多少?
- Android Studio报错Error:java.lang.RuntimeException: Crunching Cruncher xx.png failed, see logs
- 图书信息管理系统(MVC设计模式)
- 三国杀7.21服务器维护,三国杀21日7时2.75版本更新维护公告
- 005_Python字符串练习_[吉比特校招编程题]字母数字混合排序
- HTML5射击鸭子小游戏
- opencv实现靶纸弹孔识别计数功能
- Vue.js(二) 模板语法