精华内容
下载资源
问答
  • solr全文检索

    2012-07-27 09:21:11
    solr全文检索,用与搭建个人的全文检索功能。
  • Solr全文检索

    2020-01-02 03:03:26
    solr是一个apache的全文检索引擎系统, 就是个war包, 部署到Tomcat下就可以独立运行, 我们使用它的客户端工具包 solrj 来远程调用solr服务器, 完成对索引库的操作(对索引库的添加修改删除, 查询) solr底层使用...

    什么是solr:

    solr是一个apache的全文检索引擎系统, 就是个war包, 部署到Tomcat下就可以独立运行,
    我们使用它的客户端工具包 solrj 来远程调用solr服务器, 完成对索引库的操作(对索引库的添加修改删除, 查询)
    solr底层使用lucene编写。

    Lucene是一个全文检索引擎工具包,它不是一个完整的全文检索应用
    而Solr的目标是打造一款企业级的搜索引擎系统

    solr作用:

    对于大数据量搜索或者查询, 速度非常快, 并且不会随着数据量的增大而减缓查询速度.
    主要应用于大型的互联网项目中, 做大规模数据查询.

    solr同类型技术:

    elasticsearch是solr的同类型技术, elasticsearch在搜索的时候速度比solr要快.但是使用起来比solr要复杂。企业中现在elasticsearch比较流行

    solr全文检索算法(倒排索引表算法):

    使用场景: 大数据量搜索查询, 例如: 京东, 天猫的搜索功能.
    描述: 查询前先将查询的内容抽取出来组成文档(document), 也就相当于字典的正文, 
    	  然后进行切分词, 将切分出来的词组成索引(index)相当于字段的目录, 
    	  查询的时候先查询索引根据索引找文档, 这个过程叫做全文检索
    总结: 和字典原理一样.
    优点: 查询速度快, 并且不会随着查询的数据量增大而变慢, 查询结果精确
    缺点: 索引会额外占用大量的磁盘空间.(因此solrhome要与solr程序分离,不能部署到tomcat中)
    

    顺序扫描法:

    使用场景: 数据库中的like模糊查询就是用的这种算法
    描述: 拿着需要查询的关键字, 到内容中逐字逐行的对比, 直到查询内容结束
    优点: 查询准确
    缺点: 查询速度慢, 并且会随着查询内容量增大越来越慢.
    

    切分词:
    将一句一句话, 切分成一个一个词, 去掉停用词(的, 地得, a,an,the等), 去掉空格和标点符号,
    大写字母全部转成小写字母.

    solr部署到Linux服务器步骤 *:

    1. 在/usr/local目录下创建solr文件夹
    2. 复制solr安装包, ik分词器包, tomcat包到这个目录下, 并且解压
    3. 将solr/example/webapps/solr.war复制到tomcat/webapps目录下
    4. 启动tomcat目的是对war包解压, 解压完成后关闭tomcat
    5. 到tomcat/webapps目录中删除solr.war
    6. 复制solr/example/lib/ext下的所有到 tomcat/webapps/solr/WEB-INf/lib目录下
    7. 复制solr/example/solr目录到 /usr/loca/solr目录下并且改名问solrhome
    8. 配置solrhome的位置到tomcat/webapps/solr/WEB-INF/web.xml中
    9. 启动tomcat, 浏览器访问http://服务器地址:端口/solr看到solr页面后证明部署成功
    

    solrhome就是solr的家, 一个solr服务器只能有一个solrhome, 一个solrhome中可以有多个solr实例,
    里面的collection1 文件夹就是默认的solr实例, 一个solrhome中可以同时有多个实例, 实例中有索引库,
    实例和实例之间是互相隔离的.

    注意:

    1. 域名要先定义后使用, 没有定义的域名直接使用会报错

    2. solr中添加数据的时候必须有主键域id, 没有会报错

    3. solr中没有修改方法, 添加就是修改, 每次修改数据的时候, 都是根据id主键先去查询,如果查到了, 将原有数据删除, 将新数据添加进去, 这就是修改;如果没有根据id查询到数据, 则直接添加, 就成了添加.

    4. 删除:利用delete标签删除

    根据id删除
    <delete>
    <query>id: 002</query>
    </delete>
    <commit/>

    删除所有:
    <delete>
    <query>*:*</query>
    </delete>
    <commit/>

    solr中域的作用:

    自定义域名和类型就是为了保存数据库表中一列一列的数据, 表中的列名要和索引库的域名对应
    
    solr中域的分类:
    field普通域: 大多数情况都可以用这个域来完成, 主要定义了域名和域的类型.
    
    dynamicField动态域: solr中域名要先定义后使用, 没有定义就使用会报错, 如果没有定义的域名想使用可以
    					模糊匹配动态域, 让没有定义的域名可以使用.
    uniqueKey主键域: 在添加数据的时候必须有主键域, 没有会报错, 这个不用添加也不用修改, 
    				就使用这个默认的域名id就可以.
    copyField复制域: 复制域中有source叫做源域, dest代表目标域, 
    				在维护数据的时候, 源域中的内容会复制到目标域中一份, 从目标域中搜索, 就相当于从多个源域中搜索一样.
    

    ik中文分词器:

    作用: 有中文语义分析的效果, 对中文分词效果好.
    配置文件:
    	stopword.dic停止词典: 且分词的时候, 凡是出现在停止词典中的词都会被过滤掉.
    	ext.dic扩展词典: 凡是专有名词都会放到这里, 如果自然语义中不是一个词, 放到这里后solr切分词的时候就会切分成一个词.
    

    SolrJ

    solrJ是solr官方推出的客户端工具包, 将solrj的jar包放到我们项目中, 我们调用solrj中的api来远程给
    solr服务器发送命令, solr服务器就可以完成对索引库的操作

    SolrJ Demo

    1、配置业务域

    因为域名需要先定义后使用,所以要根据数据库表中的所需要数据的列名
    在 solr的schema.xml文件定义要存储的Field,这里不详细配置

    2、搭建环境

    导入需要的jar包

    3、演示solrJ的增删操作

    public class TestIndexManager {
    
        @Test
        public void testIndexCreateAndUpdate() throws Exception {
            /**
             * 创建和solr服务器连接
             * http://192.168.200.128:8080/solr是连接的默认实例也就是collection1实例
             * http://192.168.200.128:8080/solr/collection2实例
             */
            SolrServer solrServer = new HttpSolrServer("http://192.168.200.128:8080/solr");
    
            //创建文档对象
            SolrInputDocument doc = new SolrInputDocument();
            doc.addField("id", "004");
            doc.addField("title", "水浒传");
            doc.addField("price", "50");
            //添加或者修改
            solrServer.add(doc);
            //提交
            solrServer.commit();
        }
    
    	@Test
        public void testIndexDelete() throws Exception {
    
            SolrServer solrServer = new HttpSolrServer("http://192.168.200.128:8080/solr");
    
            //单个删除
            solrServer.deleteById("001");
    
            //删除所有
            solrServer.deleteByQuery("*:*");
    
            //提交
            solrServer.commit();
        }
    }
    

    4、演示solrJ的查询操作

    public class TestIndexSearch {
    
        @Test
        public void testIndexSearch() throws Exception {
    
            SolrServer solrServer = new HttpSolrServer("http://192.168.200.128:8080/solr");
    
            //创建查询对象
            SolrQuery query = new SolrQuery();
            //设置查询条件(查询所有)
            query.setQuery("*:*");
            //查询并返回响应
            QueryResponse queryResponse = solrServer.query(query);
    
            //从响应中获取结果集
            SolrDocumentList results = queryResponse.getResults();
            System.out.println("====count======" + results.getNumFound());
            for (SolrDocument result : results) {
                System.out.println("===id====" + result.get("id"));
                System.out.println("====title===" + result.get("title"));
            }
        }
    }
    

    Spring Data Solr

    Spring Data Solr其底层是对SolrJ的封装,使其由面向命令变得更加符合Java面向对象开发的思想

    Spring Data Solr Demo

    1、引入依赖(略)和 定义所需要的域名

    2、配置文件

    applicationContext-solr.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:solr="http://www.springframework.org/schema/data/solr"
    	xsi:schemaLocation="http://www.springframework.org/schema/data/solr 
      		http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
    		http://www.springframework.org/schema/beans 
    		http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context 
    		http://www.springframework.org/schema/context/spring-context.xsd">
    	<!-- solr服务器地址 -->
    	<solr:solr-server id="solrServer" url="http://192.168.200.128:8080/solr" />
    	<!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
    	<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
    		<constructor-arg ref="solrServer" />
    	</bean>
    </beans>
    

    3、创建实体类(属性名与域名对应)

    public class Item implements Serializable {
    	//属性名与域名不同则需要额外配置所对应的域名
        @Field
        private Long id;
    
        @Field("item_title")
        private String title;
    
        @Field("item_price")
        private BigDecimal price;
        
        @Field("item_image")
        private String image;
    
        @Field("item_brand")
        private String brand;
    
    	//get/set方法省略...
    }
    

    4、添加删除操作

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext-solr.xml")
    public class TestIndexManager {
    
        @Autowired
        private SolrTemplate solrTemplate;
    
        @Test
        public void testIndexCreatAndUpdate() {
            List<Item> itemList = new ArrayList<Item>();
            for(long i= 1; i < 100; i++) {
    
                Item item = new Item();
                item.setId(i);
                item.setTitle("三星手机" + i);
                item.setPrice(new BigDecimal("9999"));
                item.setBrand("三星");
    
                itemList.add(item);
            }
            //保存
            solrTemplate.saveBeans(itemList);
            //提交
            solrTemplate.commit();
        }
    
        @Test
        public void testIndexDelte() {
            //根据主键域id删除
            solrTemplate.deleteById("1");
    
            //创建查询对象
            Query query = new SimpleQuery("*:*");
            //根据查询条件删除
            solrTemplate.delete(query);
            //提交
            solrTemplate.commit();
        }
    }
    

    5、查询操作

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext-solr.xml")
    public class TestIndexSearch {
    
        @Autowired
        private SolrTemplate solrTemplate;
    
        @Test
        public void testSearch() {
            //创建查询对象
            //Query query = new SimpleQuery("*:*");
    
            //创建查询对象
            Query query = new SimpleQuery();
            //创建查询条件对象(注意这里的Criteria对象和mybatis中的那个不是同一个)
            Criteria criteria = new Criteria("item_title").contains("手机");
            //查询对象中放入查询条件
            query.addCriteria(criteria);
    
            //从第几条开始查询
            query.setOffset(11);
            //设置每页查询多少条数据
            query.setRows(20);
            //查询并返回结果
            ScoredPage<Item> items = solrTemplate.queryForPage(query, Item.class);
    
            //总页数
            int totalPages = items.getTotalPages();
            //查询到的总记录数
            long totalElements = items.getTotalElements();
            //查询到的数据集合
            List<Item> content = items.getContent();
            //每页有多少条数据
            int numberOfElements = items.getNumberOfElements();
        }
    }
    

    实现简单的搜索功能(利用Spring Data Solr)

    1、向solr索引库导入数据库数据

    省略配置spring环境

    @Component
    public class DataImportToSolr {
    
        @Autowired
        private SolrTemplate solrTemplate;
    
        @Autowired
        private ItemDao itemDao;
    
        public void importItemDataToSolr() {
            ItemQuery query = new ItemQuery();
            ItemQuery.Criteria criteria = query.createCriteria();
            criteria.andStatusEqualTo("1");
            List<Item> items = itemDao.selectByExample(query);
            if (items != null) {
                for (Item item : items) {
                    //获取规格json格式字符串
                    String specJsonStr = item.getSpec();
                    Map map = JSON.parseObject(specJsonStr, Map.class);
                    item.setSpecMap(map);
                }
                //保存
                solrTemplate.saveBeans(items);
                //提交
                solrTemplate.commit();
            }
        }
    
        public static void main(String[] args) {
            ApplicationContext contexnt = new ClassPathXmlApplicationContext("classpath*:spring/applicationContext*.xml");
            DataImportToSolr bean = (DataImportToSolr)contexnt.getBean("dataImportToSolr");
            bean.importItemDataToSolr();
        }
    }
    

    2、定义域名 和 修改实体类

    配置文件中定义要使用的域名
    pojo实体类的属性上加 @Field 注解

    3、web层接收页面传入的关键字参数

    由于这里响应回页面的是json流,所以页面自己实现跳转功能

    @RestController
    @RequestMapping("/itemsearch")
    public class SearchController {
    
        @Reference
        private SearchService searchService;
    
        /**
         * 返回的数据有查询到的集合, 总记录数, 总页数
         */
        @RequestMapping("/search")
        public Map<String, Object> search(@RequestBody  Map paramMap) {
            Map<String, Object> resultMap = searchService.search(paramMap);
            return resultMap;
        }
    }
    
    

    4、Service

    @Service
    public class SearchServiceImpl implements SearchService {
    
        @Autowired
        private SolrTemplate solrTemplate;
    
        @Override
        public Map<String, Object> search(Map paramMap) {
            /**
             * 获取查询条件
             */
            //获取查询关键字
            String keywords = String.valueOf(paramMap.get("keywords"));
            //当前页
            Integer pageNo = Integer.parseInt(String.valueOf(paramMap.get("pageNo")));
            //每页查询多少条数据
            Integer pageSize = Integer.parseInt(String.valueOf(paramMap.get("pageSize")));
    
            /**
             * 封装查询对象
             */
            //创建查询对象
            Query query = new SimpleQuery();
            //创建查询条件对象
            Criteria criteria = new Criteria("item_keywords").is(keywords);
            //将查询条件放入查询对象中
            query.addCriteria(criteria);
    
            //计算从第几条开始查询
            if (pageNo == null || pageNo <= 0) {
                pageNo = 1;
            }
            Integer start = (pageNo - 1) * pageSize;
            //设置从第几条开始查询
            query.setOffset(start);
            //设置每页查询多少条数据
            query.setRows(pageSize);
    
            /**
             * 查询并返回结果
             */
            ScoredPage<Item> items = solrTemplate.queryForPage(query, Item.class);
    
            Map<String, Object> resultMap = new HashMap<>();
            //查询到的结果集
            resultMap.put("rows",  items.getContent());
            //查询到的总页数
            resultMap.put("totalPages", items.getTotalPages());
            //查询到的总条数
            resultMap.put("total", items.getTotalElements());
    
            return resultMap;
        }
    }
    

    spring Data Solr里面的Criteria对象中的方法, is和contains的区别:
    contains: 是相当于数据库中like模糊查询的方式, 将查询关键字当成一个整体进行模糊查询
    is: 将查询关键字使用对应这个域的分词器进行切分词, 然后将切分出来的每个词, 进行查询.

    展开全文
  • solr全文检索+IK分词器

    2017-06-30 09:10:11
    solr全文检索整合ik中文分析器的配置实现搜索引擎,已在项目中使用过,可以共用
  • 下面小编就为大家分享一篇基于solr全文检索实现原理详谈,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Solr全文检索服务器

    2019-05-07 09:53:07
    一般用户使用网站的搜索功能不是对数据库进行搜索。而是使用solr或es全文检索服务器 因为数据库模糊搜索的效率低,速度...如果使用solr全文检索服务器则会很好的解决上面这三个问题 Solr的搭建部署自行百度解决 ...

    一般用户使用网站的搜索功能不是对数据库进行搜索。而是使用solr或es全文检索服务器

    • 因为数据库模糊搜索的效率低,速度慢。【不能拆分关键字进行检索】
    • 不能支持搜索的关键字高亮显示。
    • 不能实现标题与正文合并检索关键字【即使标题中没有这个要检索的关键字,但是正文中有,它同样也会被检索出来】

     

    如果使用solr全文检索服务器则会很好的解决上面这三个问题

    Solr的搭建部署自行百度解决

     


    SolrJ

    SolrJ是java操作solr的客户端

    @Field:通过@Field("solr索引库的字段名") 这个注解可以实现solr索引库的字段与pojo的成员属性绑定

    展开全文
  • solr全文检索服务器

    2018-11-06 11:39:49
    solr全文检索服务器安装: 复制solr-4.10.3.war到tomcat的webapps目录下: cp /developer/solr-4.10.3/dist/solr-4.10.3.war /usr/local/solr/tomcat/webapps/solr.war 复制solr的jar包: ...

    查看tomcat目录下的日志文件:tail -f logs/catalina.out

    solr全文检索服务器安装:

    复制solr-4.10.3.war到tomcat的webapps目录下:

    cp /developer/solr-4.10.3/dist/solr-4.10.3.war /usr/local/solr/tomcat/webapps/solr.war

    复制solr的jar包:

    cp /developer/solr-4.10.3/example/lib/ext/* /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

    配置solr的home:

    cp -r /developer/solr-4.10.3/example/solr /usr/local/solr/solrhome

    修改tomcat的webapps目录下的web.xml文件,关联solr和solrhome:

    <env-entry>

    <env-entry-name>solr/home</env-entry-name>

    <env-entry-value>/usr/local/solr/solrhome</env-entry-value>(solrhome的路径)

    <env-entry-type>java.lang.String</env-entry-type>

    </env-entry>

    solr使用中文分词器:

    加载IK Analyzer 2012FF_hf1(ext_stopword.dic停用词典、IKAnalyzer.cfg.xml、mydict.dic扩展词典、IKAnalyzer2012FF_u1.jar)

    将IKAnalyzer2012FF_u1.jar加到solr项目的lib目录下:

    cp IKAnalyzer2012FF_u1.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

    在WEB-INF下创建classes文件:mkdir /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes

    复制ext_stopword.dic、IKAnalyzer.cfg.xml、mydict.dic到classes文件下:

    cp ext_stopword.dic IKAnalyzer.cfg.xml mydict.dic /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes/

    配置solr的业务域,在/usr/local/solr/solrhome/collection1/conf/schema.xml末尾添加:

    <!-- IKAnalyzer-->

    <fieldType name="text_ik" class="solr.TextField">

    <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

    </fieldType>

     

    <field name="item_title" type="text_ik" indexed="true" stored="true"/>

    <field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>

    <field name="item_price" type="long" indexed="true" stored="true"/>

    <field name="item_image" type="string" indexed="false" stored="true" />

    <field name="item_category_name" type="string" indexed="true" stored="true" />

    <field name="item_desc" type="text_ik" indexed="true" stored="false" />

     

    <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>

    <copyField source="item_title" dest="item_keywords"/>

    <copyField source="item_sell_point" dest="item_keywords"/>

    <copyField source="item_category_name" dest="item_keywords"/>

    <copyField source="item_desc" dest="item_keywords"/>

    在solr服务器上删除:

    <delete>

    <query>*:*</query>

    </delete>

    <commit/>

    展开全文
  • Solr 全文检索服务器   solr介绍   Solr介绍 ...什么是solr ...Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文...Solr是如何实现全文检索的呢?   索引流程:solr客户端(浏览器、java程序...

    Solr

    全文检索服务器

     


    solr介绍

     

    Solr介绍

    什么是solr

    Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器。

     

    Solr比lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对lucene的性能进行了优化。

     

    Solr是如何实现全文检索的呢?

     

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

     

    搜索流程:solr客户端(浏览器、java程序)可以向solr服务端发送GET请求,solr服务器返回一个xml文档。

     

    Solr同样没有视图渲染的功能。

     

     

    Solr和lucene的区别

    Lucene是一个全文检索引擎工具包,它只是一个jar包,不能独立运行,对外提供服务。

     

    Solr是一个全文检索服务器,它可以单独运行在servlet容器,可以单独对外提供搜索和索引功能。Solr比lucene在开发全文检索功能时,更快捷、更方便。

     

     

     

    Solr安装配置

    下载solr

    Solr和lucene的版本是同步更新的,最新的版本是5.2.1

    本课程使用的版本:4.10.3

    下载地址:http://archive.apache.org/dist/lucene/solr/

    下载版本:4.10.3

    Linux下需要下载lucene-4.10.3.tgz,windows下需要下载lucene-4.10.3.zip。

     

     

     

    运行环境

    1. Jdk:1.7及以上
    2. Solr:4.10.3
    3. Mysql:5X
    4. Web服务器:tomcat 7

     

    初始化数据库脚本

     

    Solr安装配置

    Solr的安装部署

    第一步:安装tomcat

    第二步:将以下的war包,拷贝到tomcat的webapps目录下

    第三步:解压缩war包

    解压缩之后,将war包删掉

    第四步:添加solr的扩展服务包

     

     

    将以上jar包,添加到以下目录

     

    第五步:添加log4j.properties

    将以下目录的文件进行拷贝

     

    复制到以下目录

     

    第六步:在web.xml中指定solrhome的目录

     

     

     

     

     

    Solrcore的安装

    Solrcore和solrhome

    Solrhome是solr服务运行的主目录,一个solrhome目录里面包含多个solrcore目录,一个solrcore目录里面了一个solr实例运行时所需要的配置文件和数据文件。

     

    每一个solrcore都可以单独对外提供搜索和索引服务。

    多个solrcore之间没有关系。

     

     

     

     

    Solrcore和solrhome的目录结构

    Solrhome的目录结构

     

    Solrcore目录

     

     

     

    Solrcore的安装

    安装solrcore需要先安装solrhome

     

    将以下目录的文件进行拷贝

     

    复制到以下目录

     

    这样solrhome和solrcore就安装成功了。

     

     

     

     

     

     

     

    Solrcore配置

    在solrcore的conf目录下,有一个solrconfig.xml的配置文件,该配置文件,配置来solrcor的运行信息

     

    在该文件中,主要配置三个标签:lib标签、datadir标签、requestHandler标签

     

    如果对该文件不进行配置也可以,即使用默认的配置项。

     

     

     

     

     

    Lib 标签

    Solrcore需要添加一个扩展依赖包,通过lib标签来指定依赖包的地址

     

    solr.install.dir:表示solrcore的安装目录

     

    将以下目录的文件进行拷贝

     

    复制到以下目录

     

    修改lib标签

     

     

     

     

     

    datadir标签

    每个SolrCore都有自己的索引文件目录 ,默认在SolrCore目录下的data中。

    data数据目录下包括了index索引目录 和tlog日志文件目录。

    如果不想使用默认的目录也可以通过solrConfig.xml更改索引目录 ,如下:

     

     

     

     

     

    requestHandler标签

    requestHandler请求处理器,定义了索引和搜索的访问方式。

    通过/update维护索引,可以完成索引的添加、修改、删除操作。

    提交xml、json数据完成索引维护,索引维护小节详细介绍。

     

    通过/select搜索索引。

    设置搜索参数完成搜索,搜索参数也可以设置一些默认值,如下:

    <requestHandler name="/select" class="solr.SearchHandler">
    
        <!-- 设置默认的参数值,可以在请求地址中修改这些参数-->
    
        <lst name="defaults">
    
            <str name="echoParams">explicit</str>
    
            <int name="rows">10</int><!--显示数量-->
    
            <str name="wt">json</str><!--显示格式-->
    
            <str name="df">text</str><!--默认搜索字段-->
    
        </lst>
    
    </requestHandler>

     

     

    solr界面介绍

    启动solr服务

    http://localhost:8080/solr

     

     

     

     

    Dashboard

    仪表盘,显示了该Solr实例开始启动运行的时间、版本、系统资源、jvm等信息。

     

     

    Logging

    Solr运行日志信息

     

     

    Cloud

    Cloud即SolrCloud,即Solr云(集群),当使用Solr Cloud模式运行时会显示此菜单,该部分功能在第二个项目,即电商项目会讲解。

     

     

    Core Admin

    Solr Core的管理界面。在这里可以添加SolrCore实例。

     

     

    java properties

    Solr在JVM 运行环境中的属性信息,包括类路径、文件编码、jvm内存设置等信息。

     

     

    Tread Dump

    显示Solr Server中当前活跃线程信息,同时也可以跟踪线程运行栈信息。

     

     

    Core selector(重点)

    选择一个SolrCore进行详细操作,如下:

     

     

     

    Analysis(重点)

    通过此界面可以测试索引分析器和搜索分析器的执行情况。

    注:solr中,分析器是绑定在域的类型中的

     

     

     

     

    dataimport

    可以定义数据导入处理器,从关系数据库将数据导入到Solr索引库中。

    默认没有配置,需要手工配置。

     

     

     

    Document(重点)

    通过/update表示更新索引,solr默认根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新

     

    通过此菜单可以创建索引、更新索引、删除索引等操作,界面如下:

     

     

     

    1. overwrite="true" : solr在做索引的时候,如果文档已经存在,就用xml中的文档进行替换
    2. commitWithin="1000" : solr 在做索引的时候,每个1000(1秒)毫秒,做一次文档提交。为了方便测试也可以在Document中立即提交,</doc>后添加“<commit/>”

     

     

    Query(重点)

    通过/select执行搜索索引,必须指定“q”查询条件方可搜索。

     

     

     

    多solrcore的配置

    配置多solrcore的好处:

    1. 在进行solrcloud的时候,必须配置多solrcore
    2. 每个solrcore之间是独立的,都可以单独对外提供服务。不同的业务模块可以使用不同的solrcore来提供搜索和索引服务。

     

    添加

     

     

    第一步:复制solrhome下的collection1目录到本目录下,修改名称为collection2

     

    第二步:修改solrcore目录下的core.properties

     

    这样多solrcore就配置完成了。

     

     

    Solr的基本使用

     

    1. Schema.xml

    在schema.xml文件中,主要配置了solrcore的一些数据信息,包括Field和FieldType的定义等信息,在solr中Field和FieldType都需要先定义后使用

     

     

     

    Filed

    定义Field域

     

    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />

     

    Name:指定域的名称

    Type:指定域的类型

    Indexed:是否索引

    Stored:是否存储

    Required:是否必须

    multiValued:是否多值,比如商品信息中,一个商品有多张图片,一个Field像存储多个值的话,必须将multiValued设置为true。

     

     

    dynamicField

    动态域

    <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>

     

    Name:指定动态域的命名规则

     

     

     

    uniqueKey

    指定唯一键

     

    <uniqueKey>id</uniqueKey>

     

    其中的id是在Field标签中已经定义好的域名,而且该域要设置为required为true。

     

    一个schema.xml文件中必须有且仅有一个唯一键

     

     

    copyField

    复制域

     

    <copyField source="cat" dest="text"/>

     

    Source:要复制的源域的域名

    Dest:目标域的域名

     

    由dest指的的目标域,必须设置multiValued为true。

     

     

     

     

    FieldType

    定义域的类型

     

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    
          <analyzer type="index">
    
            <tokenizer class="solr.StandardTokenizerFactory"/>
    
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    
            <!-- in this example, we will only use synonyms at query time
    
            <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    
            -->
    
            <filter class="solr.LowerCaseFilterFactory"/>
    
          </analyzer>
    
          <analyzer type="query">
    
            <tokenizer class="solr.StandardTokenizerFactory"/>
    
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
    
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    
            <filter class="solr.LowerCaseFilterFactory"/>
    
          </analyzer>
    
        </fieldType>

    Name:指定域类型的名称

    Class:指定该域类型对应的solr的类型

    Analyzer:指定分析器

    Type:index、query,分别指定搜索和索引时的分析器

    Tokenizer:指定分词器

    Filter:指定过滤器

     

    中文分词器

    使用ikanalyzer进行中文分词

     

    第一步:将ikanalyzer的jar包拷贝到以下目录

     

    第二步:将ikanalyzer的扩展词库的配置文件拷贝到 目录

     

    第三步:配置FieldType

     

    第四步:配置使用中文分词的Field

     

    第五步:重启tomcat

     

     

    配置业务Field

    需求

    对京东案例中的products表的数据进行索引,所以需要先定义对应的Field域。

     

     

    分析配置

    Products的表结构

     

    需要往索引库添加的字段有:

    pid、name、catalog、catalog_name、price、description、picture

     

    FieldType:

    经分析,由于中文分词器已经配置完FieldType,所以目前FieldType已经满足需要,无需配置。

     

    Field:

    Pid:

    由于pid在products表中是唯一键,而且在solr的shema.xml中已有一个id的唯一键配置,所以不需要再重新定义pid域。


     

    Name:
    
    <!-- 商品名称 -->
    
    <field name="product_name" type="text_ik" indexed="true" stored="true"/>
    
    
    
    Catalog、catalog_name:
    
    <!-- 商品分类ID -->
    
    <field name="product_catalog" type="string" indexed="true" stored="true"/>
    
    <!-- 商品分类名称 -->
    
    <field name="product_catalog_name" type="string" indexed="true" stored="false"/>
    
    
    
    Price:
    
    <!-- 商品价格 -->
    
    <field name="product_price" type="float" indexed="true" stored="true"/>
    
    
    
    Description:
    
    <!-- 商品描述 -->
    
    <field name="product_description" type="text_ik" indexed="true" stored="false"/>
    
    
    
    Picture:
    
    <!-- 商品图片地址 -->
    
    <field name="product_picture" type="string" indexed="false" stored="true"/>
    
    

     

     

    Dataimport

    该插件可以将数据库中指定的sql语句的结果导入到solr索引库中。

     

     

    第一步:添加jar包

    1. Dataimport的jar包

    复制以下目录的jar包

     

    添加到以下目录

     

    修改solrconfig.xml文件,添加lib标签

    <lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*\.jar" />
    1. MySQL数据库驱动包

    将mysql的驱动包,复制到以下目录

    修改solrconfig.xml文件,添加lib标签

    <lib dir="${solr.install.dir:../..}/contrib/db/lib" regex=".*\.jar" />

     

     

     

     

    第二步配置requestHandler

    在solrconfig.xml中,添加一个dataimport的requestHandler

     

     

     

     

    第三步:创建data-config.xml

    在solrconfig.xml同级目录下,创建data-config.xml

     

     

     

    重启tomcat

    Solrj的使用

    什么是solrj

    Solrj就是solr服务器的java客户端。

     

     

    环境准备

    1. Jdk
    2. Ide
    3. Tomcat
    4. Solrj

     

     

    搭建工程

    1. Solrj的依赖包和核心包

    1. Solr的扩展服务包

     

     

    使用solrj完成索引维护

    添加/修改索引

    在solr中,索引库中都会存在一个唯一键,如果一个Document的id存在,则执行修改操作,如果不存在,则执行添加操作。

     

     

     

    删除索引

    根据指定ID来删除

     

     

     

     

    根据条件删除

     

     

     

     

     

    查询索引

    简单查询

     

     

     

     

    复杂查询

    solr的查询语法

    1. q - 查询关键字,必须的,如果查询所有使用*:*。

    请求的q是字符串

     

     

    1. fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如::

    请求fq是一个数组(多个值)

    过滤查询价格从1到20的记录。

    也可以在“q”查询条件中使用product_price:[1 TO 20],如下:

    也可以使用“*”表示无限,例如:

    20以上:product_price:[20 TO *]

    20以下:product_price:[* TO 20]

     

    1. sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:

    按价格降序

    1. start - 分页显示使用,开始记录下标,从0开始
    2. rows - 指定返回结果最多有多少条记录,配合start来实现分页。

    实际开发时,知道当前页码和每页显示的个数最后求出开始下标。

     

     

     

    1. fl - 指定返回那些字段内容,用逗号或空格分隔多个。

    显示商品图片、商品名称、商品价格

     

    1. df-指定一个搜索Field

    也可以在SolrCore目录 中conf/solrconfig.xml文件中指定默认搜索Field,指定后就可以直接在“q”查询条件中输入关键字。

     

     

    1. wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。

     

    1. hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。

     

     

     

     

     

     

    代码

    @Test
    
    public void search02() throws Exception {
    
    // 创建HttpSolrServer
    
    HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr");
    
    // 创建SolrQuery对象
    
    SolrQuery query = new SolrQuery();
    
    
    
    // 输入查询条件
    
    query.setQuery("product_name:小黄人");
    
    // query.set("q", "product_name:小黄人");
    
    
    
    // 设置过滤条件
    
    // 如果设置多个过滤条件的话,需要使用query.addFilterQuery(fq)
    
    query.setFilterQueries("product_price:[1 TO 10]");
    
    
    
    // 设置排序
    
    query.setSort("product_price", ORDER.asc);
    
    // 设置分页信息(使用默认的)
    
    query.setStart(0);
    
    query.setRows(10);
    
    
    
    // 设置显示的Field的域集合
    
    query.setFields("id,product_name,product_catalog,product_price,product_picture");
    
    
    
    // 设置默认域
    
    query.set("df", "product_keywords");
    
    
    
    // 设置高亮信息
    
    query.setHighlight(true);
    
    query.addHighlightField("product_name");
    
    query.setHighlightSimplePre("<em>");
    
    query.setHighlightSimplePost("</em>");
    
    
    
    // 执行查询并返回结果
    
    QueryResponse response = server.query(query);
    
    // 获取匹配的所有结果
    
    SolrDocumentList list = response.getResults();
    
    // 匹配结果总数
    
    long count = list.getNumFound();
    
    System.out.println("匹配结果总数:" + count);
    
    
    
    // 获取高亮显示信息
    
    Map<String, Map<String, List<String>>> highlighting = response
    
    .getHighlighting();
    
    for (SolrDocument doc : list) {
    
    System.out.println(doc.get("id"));
    
    
    
    List<String> list2 = highlighting.get(doc.get("id")).get(
    
    "product_name");
    
    if (list2 != null)
    
    System.out.println("高亮显示的商品名称:" + list2.get(0));
    
    else {
    
    System.out.println(doc.get("product_name"));
    
    }
    
    
    
    System.out.println(doc.get("product_catalog"));
    
    System.out.println(doc.get("product_price"));
    
    System.out.println(doc.get("product_picture"));
    
    System.out.println("=====================");
    
    }
    
    }

     

    京东案例

    需求

    使用Solr实现电商网站中商品信息搜索功能,可以根据关键字、分类、价格搜索商品信息,也可以根据价格进行排序,同时还可以分页。

    界面如下:

     

     

    分析

    UI分析

     

     

    架构分析

    应用服务器服务端

    表现层:使用springmvc接收前台搜索页面的查询条件等信息

    业务层:调用dao层完成数据库持久化

    如果数据库数据发生变化调用solrj的客户端同步索引库

    Dao层:使用mybatis完成数据库持久化

     

    Solrj服务器:

    提供搜索和索引服务

     

    数据库服务器:

    提供数据库服务

     

     

    工程搭建

    1. Solrj的jar包
    2. Solr的扩展包
    3. Springmvc的包

     

     

    代码实现

    Pojo

     

     

     

    Service

    Service接口

     

    Service实现类

    @Service
    
    public class ProductServiceImpl implements ProductService {
    
    
    
    // 依赖注入HttpSolrServer
    
    @Autowired
    
    private HttpSolrServer server;
    
    
    
    @Override
    
    public ResultModel getProducts(String queryString, String catalogName,
    
    String price, String sort, Integer page) throws Exception {
    
    // 创建SolrQuery对象
    
    SolrQuery query = new SolrQuery();
    
    
    
    // 输入关键字
    
    if (StringUtils.isNotEmpty(queryString)) {
    
    query.setQuery(queryString);
    
    } else {
    
    query.setQuery("*:*");
    
    }
    
    
    
    // 输入商品分类过滤条件
    
    if (StringUtils.isNotEmpty(catalogName)) {
    
    query.addFilterQuery("product_catalog_name:" + catalogName);
    
    }
    
    
    
    // 输入价格区间过滤条件
    
    // price的值:0-9 10-19
    
    if (StringUtils.isNotEmpty(price)) {
    
    String[] ss = price.split("-");
    
    if (ss.length == 2) {
    
    query.addFilterQuery("product_price:[" + ss[0] + " TO " + ss[1]
    
    + "]");
    
    }
    
    }
    
    
    
    // 设置排序
    
    if ("1".equals(sort)) {
    
    query.setSort("product_price", ORDER.desc);
    
    } else {
    
    query.setSort("product_price", ORDER.asc);
    
    }
    
    
    
    // 设置分页信息
    
    if (page == null)
    
    page = 1;
    
    
    
    query.setStart((page - 1) * 20);
    
    query.setRows(20);
    
    
    
    // 设置默认域
    
    query.set("df", "product_keywords");
    
    
    
    // 设置高亮信息
    
    query.setHighlight(true);
    
    query.addHighlightField("product_name");
    
    query.setHighlightSimplePre("<font style=\"color:red\" >");
    
    query.setHighlightSimplePost("</font>");
    
    
    
    QueryResponse response = server.query(query);
    
    // 查询出的结果
    
    SolrDocumentList results = response.getResults();
    
    // 记录总数
    
    long count = results.getNumFound();
    
    
    
    List<Products> products = new ArrayList<>();
    
    Products prod;
    
    
    
    // 获取高亮信息
    
    Map<String, Map<String, List<String>>> highlighting = response
    
    .getHighlighting();
    
    for (SolrDocument doc : results) {
    
    prod = new Products();
    
    
    
    // 商品ID
    
    prod.setPid(doc.get("id").toString());
    
    
    
    List<String> list = highlighting.get(doc.get("id")).get(
    
    "product_name");
    
    // 商品名称
    
    if (list != null)
    
    prod.setName(list.get(0));
    
    else {
    
    prod.setName(doc.get("product_name").toString());
    
    }
    
    
    
    // 商品价格
    
    prod.setPrice(Float.parseFloat(doc.get("product_price").toString()));
    
    // 商品图片地址
    
    prod.setPicture(doc.get("product_picture").toString());
    
    
    
    products.add(prod);
    
    }
    
    
    
    // 封装ResultModel对象
    
    ResultModel rm = new ResultModel();
    
    rm.setProductList(products);
    
    rm.setCurPage(page);
    
    rm.setRecordCount(count);
    
    
    
    int pageCount = (int) (count / 20);
    
    
    
    if (count % 20 > 0)
    
    pageCount++;
    
    // 设置总页数
    
    rm.setPageCount(pageCount);
    
    
    
    return rm;
    
    }
    
    }
    
    

     

     

     

    Controller

    代码

     

     

     

     

    Jsp静态资源

    从资料中拷贝

     

     

     

    图片信息放到以下目录

     

     

     

     

    Web.xml

     

     

     

     

    配置springmvc.xml

    展开全文
  • solr全文检索环境搭建

    2011-12-22 15:37:34
    solr全文检索环境搭建, 我已经把solr环境都准备好了。你只需要根据我在文档中的说明放到你的环境下就可以了。
  • solr全文检索实现原理

    2021-02-24 12:06:59
    Lucene是apache软件基金会4jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...
  • solr全文检索服务器的应用 1.Solr安装与配置 1.1什么是Solr 大多数搜索引擎应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗并且它们由于沉重的数据库加载而拖垮你的应用的性能。 这就是为什么转移...
  • solr全文检索中需要用到的apache-solr-1.4.1.zip
  • Solr是Apache的顶级开源项目,使用java开发 ,基于Lucene的全文检索服务器。 Solr比Lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对Lucene的性能进行了优化。
  • solr全文检索开发

    2013-12-02 23:53:44
    solr 是一款全文检索搜索引擎的开源项目,基于java 开发,可实现全文检索,地里信息定位服务的实现等。
  • linux环境搭建solr全文检索服务第一步:安装tomcattomcat下载地址:https://pan.baidu.com/s/1fW-wJqgUu74P0UJTp6Of5w 密码:pc86第二步:将solr-4.10.3.tgz.tgz 上传到linux 并解压缩工具下载地址:...
  • 分布式_solr全文检索实现原理

    千次阅读 2018-01-09 09:19:13
    solr全文检索实现原理  Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出...
  • solr全文检索实现原理  Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作...
  • Solr全文检索框架

    2019-04-19 11:28:00
    概述:  什么是Solr? Solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务.Solr... 全文检索服务(也叫做全文搜索): 服务 是War包. ES框架 也是基于Lucene,Lucene(是工具包 jar)  ...
  • 本次将介绍solr全文检索服务器的搭建和基本使用,下面将从服务器搭建、schema配置、solrj与spring整合、solrj简单使用等几个方面介绍
  • Solr 是apache 的一个顶级开源项目,采用java开发,它是基于Lucene的全文检索服务器,solr 提供了比Lucene更为丰富的查询语言,同时实现了可配置可扩展,并对索引,搜索性能进行了优化 Linux 下安装Solr 解压Solr ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,964
精华内容 785
关键字:

solr全文检索