solr-

思维导图

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));
            }
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值