Solr简单总结

Solr

运行Solr服务

方式一:Jetty服务器启动Solr

  1. 进入solr-4.10.2/example目录
  2. 打开命令行,执行java –jar start.jar命令,即可启动Solr服务
  3. 打开浏览器,通过http://localhost:8983/solr来访问Solr管理页面。

方式二:Tomcat服务器启动Solr

  1. 部署Web服务,将solr-4.10.2/example/webapps/solr.war复制到自己的tomcat/webapps目录中,并解压,然后删除solr.war文件
  2. 在Tomcat中加入相关jar包:将“resource\solr在tomcat运行需要导入的jar包\lib”下的jar包复制tomcat/webapps/solr/WEB-INF/lib下。

    并且把class/log4j.properties复制到tomcat/webapps/solr/WEB-INF下

  3. 修改Tomcat配置文件,指向Solr的索引库及配置目录。

    注意,这里可以指向solr-4.10.2/example/solr目录,如果想独立出来,也可以将这个solr文件夹复制出来到任意位置(不要出现中文),例如:例如:C:/tmp/solr

  4. 进入Tomcat文件夹,用记事本打开:tomcat/bin/catalina.bat文件,添加一条配置信息,指向我们的索引库及配置目录:set "JAVA_OPTS=-Dsolr.solr.home=C:/tmp/solr"
  5. 进入tomcat/bin目录,双击 startup.bat文件启动服务器
  6. 打开浏览器,访问http://localhost:8080/solr 进入Solr管理页面

Solr管理页面

Dashboard仪表盘

显示solr服务及系统运行信息

Logging(日志)

solr运行的日志信息

Core Admin(Core管理)

在Solr中,每一个Core,代表一个索引库,里面包含索引数据及其配置信息。

Solr中可以拥有多个Core,也就同时管理多个索引库!就像在MySQL中可以有多个database一样!

JavaProperties

Java运行环境信息

ThreadDump

solr运行线程信息

CoreSelector(Core选择器)

schema.xml

注意:在本文件中,有两个字段是Solr自带的字段,绝对不要删除:_version_节点和_root_节点

Field字段定义字段的属性信息段

属性及含义:

name:字段名称,最好以下划线或者字母开头

type:字段类型,指向的是本文件中的

FieldType指定数据类型

属性及含义:

name:字段类型的名称,可以自定义,

唯一主键

Lucene中本来是没有主键的。删除和修改都需要根据词条进行匹配。而Solr却可以设置一个字段为唯一主键,这样删改操作都可以根据主键来进行!

IK分词器

<fieldType name="text_ik" class="solr.TextField">
    <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>

SolrJ的使用

添加或修改索引库数据

private static String baseURL = "http://localhost:8080/solr/core1";
@Test
public void createTest() throws Exception {
    //连接solr服务器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    //创建文档对象
    SolrInputDocument document = new SolrInputDocument();
    document.addField("id", "5");
    document.addField("title", "8848手机,钛合金外壳,注定不平凡");
    document.addField("content", "8848发发发");
    //向solr服务器写入文档
    solrServer.add(document);
    solrServer.commit();
}
@Test
public void create2Test() throws Exception {
    //连接solr服务器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    //创建文档对象
    Item item = new Item();
    item.setId("6");
    item.setTitle("金立M2017成功人士的标配");
    item.setContent("金立你值得拥有");
    //向solr服务器写入文档
    solrServer.addBean(item);
    solrServer.commit();

}
//添加@Field注解
public class Item{
    @Field
    private String id;
    @Field
    private String title;
    @Field
    private String content;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
}

删除索引库数据

@Test
public void deleteTest() throws SolrServerException, IOException {
    // 连接solr服务器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    // 删除索引
    //solrServer.deleteById("6");
    solrServer.deleteByQuery("title:金立");
    // 提交
    solrServer.commit();
}

查询索引库数据

在创建SolrQuery时,我们填写的Query语句,可以有以下高级写法:

  1. 通配符?和 *:“*”表示匹配任意字符;“?”表示匹配出现的位置
  2. 布尔操作:AND、OR和NOT布尔操作(推荐使用大写,区分普通字段)
  3. 子表达式查询(子查询):可以使用“()”构造子查询。比如:(query1 AND query2) OR (query3 AND query4)
  4. 相似度查询:指定编辑距离的相似度查询:对模糊查询可以设置编辑距离,可选0-2的整数(默认为2):title:appla~1。
  5. 范围查询(Range Query):Lucene支持对数字、日期甚至文本的范围查询,并且两端范围。结束的范围可以使用“*”通配符。

    (1)日期范围(ISO-8601时间GMT):a_begin_date:[1990-01-01T00:00:00.000Z TO 1999-12-31T24:59:99.999Z]

    (2)数字:salary:[2000 TO *]

    (3)文本:entryNm:[a TO a]

@Test
public void queryTest() throws SolrServerException{
    // 连接solr服务器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    //创建查询条件对象
    SolrQuery params = new SolrQuery("*:*");
    //执行查询,获取响应数据
    QueryResponse response = solrServer.query(params);
    //获取数据结果集
    SolrDocumentList list = response.getResults();
    System.out.println("一共获取了" + list.size()+"条结果:");
    for (SolrDocument solrDocument : list) {
        System.out.println("id: " + solrDocument.getFieldValue("id"));
        System.out.println("title:" + solrDocument.getFieldValue("title"));
    }
}
@Test
public void queryBeanTest() throws SolrServerException{
    // 连接solr服务器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    //创建查询条件对象
    SolrQuery params = new SolrQuery("*:*");
    //执行查询,获取响应
    QueryResponse response = solrServer.query(params);
    List<Item> beans = response.getBeans(Item.class);
    System.out.println("一共获取了" + beans.size()+"条结果:");
    for (Item item : beans) {
        System.out.println("id: " + item.getId());
        System.out.println("title:" + item.getTitle());
    }
}

实现排序

@Test
public void querySortTest() throws SolrServerException, IOException {
    // 连接solr服务器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    // 创建查询条件对象,范围查询,包含两端
    SolrQuery query = new SolrQuery("*:*");
    // 设置查询的排序参数,1-排序的字段名,2-排序方式(ORDER:asc desc)
    query.setSort("id", ORDER.asc);
    // 执行查询,获取响应数据
    QueryResponse response = solrServer.query(query);
    // 获取结果集数据
    List<Item> list = response.getBeans(Item.class);
    System.out.println("总记录数  numFound:"+response.getResults().getNumFound());
    for (Item item : list) {
        System.out.println("id: " + item.getId());
        System.out.println("title:" + item.getTitle());
    }
}

实现分页

@Test
public void queryPageTest() throws SolrServerException, IOException {
    // 准备分页参数
    int pageNum = 1; //页码
    int pageSize = 2; //每页条数
    // 连接solr服务器
    HttpSolrServer solrServer = new HttpSolrServer(baseURL);
    // 创建查询条件对象
    SolrQuery params = new SolrQuery("*:*");
    // 设置查询的排序参数,1-排序的字段名,2-排序方式(ORDER:asc desc)
    params.setStart((pageNum-1)*pageSize);//设置起始条数
    params.setRows(pageSize);//设置每页条数
    // 执行查询,获取响应数据
    QueryResponse response = solrServer.query(params);
    // 获取结果集数据
    SolrDocumentList list = response.getResults();
    System.out.println("一共获取了" + list.size() + "条结果:");
    for (SolrDocument solrDocument : list) {
        System.out.println("id: " + solrDocument.getFieldValue("id"));
        System.out.println("title:" + solrDocument.getFieldValue("title"));
    }
}

实现高亮

@Test
public void highLightingTest() throws SolrServerException, IOException{
    // 初始化solrj服务
    HttpSolrServer server = new HttpSolrServer(baseURL);
    // 设置查询条件
    SolrQuery params = new SolrQuery("title:手机");
    // 设置前置标签
    params.setHighlightSimplePre("<em >");
    // 设置后置标签
    params.setHighlightSimplePost("</em>");
    // 添加高亮字段
    params.addHighlightField("title");
    // 执行查询
    QueryResponse queryResponse = server.query(params);
    // 外层的Map,key:id,value:id以外的其他高亮字段,可能有多个,也是一个Map
    // 内层的Map,key:高亮字段的名称,value:字段的内容,集合
    Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
    // 遍历map,获取结果
    Set<String> ids = highlighting.keySet();
    for (String id : ids) {
        System.out.println("id: " + id);;
        // 获取高亮字段的集合
        Map<String, List<String>> map = highlighting.get(id);
        // 获取高亮字段
        System.out.println(map.get("title").get(0));
        // 因为content不是高亮字段,所以打印出的内容为null
        System.out.println(map.get("content"));
    }

}

原文地址:https://www.cnblogs.com/lifuwei/p/9184754.html

时间: 2024-08-02 14:55:31

Solr简单总结的相关文章

solr 简单搭建 数据库数据同步(待续)

原来在别的公司负责过文档检索模块的维护(意思就是不是俺开发的啦).所以就稍微接触和研究了下文档检索. 文档检索其实是全文检索,是通过一种技术把N多文档进行一定规律的切割归类,然后创建易于搜索的索引式文件,然后搜索具有某些规律的文档时,能够通过快速定位索引,然后根据索引提供的信息精确定位到文档从而实现迅速找到文档.这个文档一般成为条目. 上家公司的时候使用的是Lucene加上Zoie实现的.lucene是apache下的开源项目,不过并不是全文检索的实现,而是一个全文检索的引擎,是一个架构,是其他

Solr简单理解

怎么理解Solr是个什么东西呢? 引用官网的介绍, Solr is the popular, blazing-fast, open source enterprise search platform built on Apache Lucene™. Solr是一个基于Lucene构建的,受欢迎且速度极快的企业搜索平台. 什么意思呢? 我的简单理解就是,Solr是一个独立系统,它给我们提供了很多api来操作它所连接的“数据库”,我们可以通过api对数据库进行CRUD操作,而且查询操作还贼TM快..

Maven和Solr简单总结

一.1.Maven介绍 Maven是一个项目管理工具,Maven通过POM项目对象模型,对象项目进行管理,通过一个配置文件(xml文件)进行项目的管理.对象项目的声明周期中每个阶段进行管理(清理,编译,测试,打包). POM项目对象模型的理解:①类之间的关系:继承.依赖.聚合:②管理项目之间的关系:使用maven工具可以完成项目之间的继承,项目的依赖,项目的聚合: 2.maven项目得仓库 maven可以管理项目和第三方的jar包的依赖关系.只需要在配置文件中描述maven,当前项目需要的哪些j

solr简单搜索案例

使用Solr实现电商网站中商品信息搜索功能,可以根据关键字搜索商品信息,根据商品分类.价格过滤搜索结果,也可以根据价格进行排序,实现分页.界面如下: 架构分为: 1. solr服务器 2. 自己的web服务器(需要开发) 3. 数据库mysql solr案例 本案例用的springmvc+solr+mysql 自己开发的应用 1. Controller 获取搜索条件,并响应搜索结果到前台页面. 2. Service 使用solrj来调用solr的服务进行索引和搜索 Service调用dao进行商

solr简单搭建与使用

安装步骤: java环境, jdk1.8 从官网下载最新的solr7.5 wget http://mirrors.hust.edu.cn/apache/lucene/solr/7.5.0/solr-7.5.0.tgz 解压 :tar -zxvf solr-7.5.0.tgz -C /usr/local/ 添加环境变量:vim /etc/profile #solr7.5 export PATH=$PATH:/usr/local/solr-7.5.0/bin/ 启动失败原因: 这是因为使用的是roo

Solr入门指南

本文转自http://chuanliang2007.spaces.live.com/blog/cns!E5B7AB2851A4C9D2!499.entry?wa=wsignin1.0 因为搜索引擎功能在门户社区中对提高用户体验有着重在门户社区中涉及大量须要搜索引擎的功能需求.眼下在实现搜索引擎的方案上有集中方案可供选择: 1. 基于Lucene自己进行封装实现站内搜索.工作量及扩展性都较大,不採用. 2. 调用Google.Baidu的API实现站内搜索.同第三方搜索引擎绑定太死.无法满足后期业

solr在使用solrj操作中的各个操作大全(在solrcores中测试)

package com.fjsh.SearchJobsFirst; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import jav

【转载】Instagram架构分析笔记

原文地址:http://chengxu.org/p/401.html Instagram 架构分析笔记 全部 技术博客 Instagram团队上个月才迎来第 7 名员工,是的,7个人的团队.作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张.不得不说,这真他妈是个业界奇迹. 几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instance

instagram架构分析_转

转自:http://www.eit.name/blog/read.php?504 Instagram 团队上个月才迎来第 7 名员工,是的,7个人的团队.作为 iPhone 上最火爆的图片类工具,instagram 用户数量已经超过 1400 万,图片数量超过 1.5 亿张.不得不说,这真他妈是个业界奇迹. 几天前,只有三个人的 Instagram 工程师团队发布了一篇文章:What Powers Instagram: Hundreds of Instances, Dozens of Techn