solr

Solr是如何实现全文检索的呢?
索引流程:solr客户端(浏览器、java 程序)可以向solr服务端发送POST请求,请求内容
是包含Field等信息的一个xml文档,通过该文档,solr 实现对索引的维护(增删改)

solr7.7.1整合tomcat8.5.51(windows版本)
https://www.cnblogs.com/aizm/p/10913334.html

solr配置IK分词器:
1.把IK分词器的jar包,放入到tomcat下solr的web-inf目录下的lib目录下,然后把扩展词和停止词和配置文件放入到web-inf下的classes目录下,没有则自己创建
2.在managed-schema文件中配置ik分词器的配置,这个文件一般在你要用的core的conf文件夹下

	<!-- ik分词器 -->
	<fieldType name="text_ik" class="solr.TextField">
	  <analyzer type="index">
		  <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
		  <filter class="solr.LowerCaseFilterFactory"/>
	  </analyzer>
	  <analyzer type="query">
		  <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
		  <filter class="solr.LowerCaseFilterFactory"/>
	  </analyzer>
	</fieldType>

solr界面管理
1.删除

xml删除
	<delete>
		<id>1</id>  //删除id为1的
	</delete>
	<delete>
		<query>id:xxxx<query> //删除指定id的,在solr中,id是string类型,*:*表示删除所有
	</delete>

更新

想改哪个只要改后面的就行了,solr是先删除,后添加
	{"id":"changeme","title":"文章","name":"张三"}

solr导入数据
https://blog.csdn.net/zhou_p/article/details/80839698

solr管理界面查询:
q:查询
fq:过滤查询
fl:域列表,id,product_name,想要哪个域显示出来,就输入哪个
df:默认域

product_price:[* TO 10]  无穷小到10,搜索0-10块钱的东西
product_price:[10 TO *]  10到无穷大 ,中括号表示包含,大括号表示不包含

solrj的基本用法:

package com.xzw.solrj;

import org.apache.http.client.HttpClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;

import java.util.List;
import java.util.Map;

/**
* solrJ管理
 * 增加
 * 修改
 * 删除
 * 查询
* */
public class SolrJManager {
    private final static String solrUrl = new String("http://localhost:8080/solr/");

    public static void main(String[] args) {

    }

    //创建solrserver对象
    public HttpSolrClient getHttpSolrClient(){
         return new HttpSolrClient.Builder(solrUrl).withConnectionTimeout(1000).withSocketTimeout(6000).build();
    }

    /**
     * 测试solr服务器的添加
     * */
    @Test
    public void testAdd() throws Exception{
        //构建一篇文档
        SolrInputDocument document = new SolrInputDocument();
        //往doc中添加字段
        document.setField("id","haha");
        document.setField("name","修志武");

        //获得一个solr服务器端的请求,选择具体的某一个solr core
        HttpSolrClient client = new HttpSolrClient.Builder(solrUrl + "new_core").build();
        client.add(document);
        client.commit();
        client.close();
    }

    /**
     * 根据id从索引库中删除问的文档
     * */
    @Test
    public void testDelete() throws Exception{
        HttpSolrClient client = new HttpSolrClient.Builder(solrUrl+"new_core").build();

        client.deleteByQuery("*:*",1000);
    }

    /**
     * 更新
     * 与添加一致,id相同就是修改,id不同就是添加
     * */
    @Test
    public void testUpdate() throws Exception{
        HttpSolrClient client = new HttpSolrClient.Builder(solrUrl+"new_core").build();
        //创建一个文档
        SolrInputDocument document = new SolrInputDocument();
        document.addField("id","haha");
        document.addField("name","吴慧敏");

        client.add(document);
        client.commit();
        client.close();
    }


    /**
     * 查询
     * */
    @Test
    public void testQuery()throws Exception{
        //获取连接
        HttpSolrClient client = new HttpSolrClient.Builder(solrUrl + "new_core").build();
        //查询 关键词 台灯 过滤条件 "product_catalog_name":"幽默杂货" "product_price":18.9
        SolrQuery query = new SolrQuery();

        //设置query查询参数
        //关键词
//        query.set("q","product_name:台灯");
        query.setQuery("台灯"); //设置了默认域
        //过滤查询
        query.set("fq","product_catalog_name:幽默杂货");
        query.set("fq","product_price:[* TO 18.9]");
        //按照价格排序
        query.addSort("product_price", SolrQuery.ORDER.desc);//降序排序
        //分页
        query.setStart(0);
        query.setRows(5);
        //默认域
        query.set("df","product_name");
        //只查询指定域
        query.set("fl","product_name,product_price");
        //高亮
        //打开高亮开关
        query.setHighlight(true);
        //指定高亮域
        query.addHighlightField("product_name");
        //前缀
        query.setHighlightSimplePre("<font color='red'>");
        //后缀
        query.setHighlightSimplePost("</font>");

        //获取查询结果
        QueryResponse response = client.query(query);
        //文档结果集
        SolrDocumentList docs = response.getResults();
        //总条数
        long numFound = docs.getNumFound();

        //Map k id v Map
        //Map k 域名 v list
        //list list.get(0)
        Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

        System.out.println(numFound);
        for (SolrDocument doc : docs){
            /**
             *         "product_catalog_name":"幽默杂货",
             *         "product_price":18.9,
             *         "product_name":"花儿朵朵彩色金属门后挂&nbsp;8钩免钉门背挂钩2066",
             *         "id":"1",
             *         "product_picture":"2014032613103438.png",
             * */
            System.out.println("商品标签:"+doc.get("product_catalog_name"));
            System.out.println("价格:"+doc.get("product_price"));
            System.out.println("产品:"+doc.get("product_name"));
            System.out.println("商品编号:"+doc.get("id"));
            System.out.println("商品图片:"+doc.get("product_picture"));
            System.out.println("寂寞的分割线-------------------------------");
           /* Map<String, List<String>> map = highlighting.get(doc.get("id"));
            List<String> list = map.get("product_name");
            System.out.println(list.get(0));
            System.out.println();*/
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值