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

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

    2019-07-18 11:20:28
    Solr 全文搜索

    1. 概述

    在本文中,我们将探讨一个Apache Solr搜索引擎中的基本概念 - 全文搜索。

    Apache Solr是一个开源框架,旨在处理数百万的文档。我们将通过使用Java库- SolrJ的示例来介绍它的核心功能。

    2. maven配置

    由于Solr是开源的 - 我们可以简单地下载二进制文件并在我们的应用程序中单独启动服务器。

    要与服务器通信,我们将为SolrJ客户端定义Maven依赖项:

    <dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-solrj</artifactId>
        <version>6.4.2</version>
    </dependency>

    你将在这儿找到最新的依赖。

    3. 索引数据

    为了索引和搜索数据,我们需要创建一个core以及一个item来索引数据。

    在我们这样做之前,我们需要在服务器上为数据建立索引,以便它可以搜索。

    我们可以通过许多不同的方式为数据建立索引。我们可以使用数据导入处理程序直接从关系数据库导入数据,使用Apache Tika通过Solr Cell上传数据或使用索引处理程序上传XML/ XSLT,JSON和CSV数据。

    3.1 索引Solr文档

    我们可以通过创建SolrInputDocument将数据索引到核心。首先,我们需要使用我们的数据填充文档,然后只调用SolrJ的API为文档建立索引:

    SolrInputDocument doc = new SolrInputDocument();
    doc.addField("id", id);
    doc.addField("description", description);
    doc.addField("category", category);
    doc.addField("price", price);
    solrClient.add(doc);
    solrClient.commit();

    请注意,id对于不同的item应该是唯一的。已建立索引的文档根据ID更新该文档。

    3.2 索引 Beans

    SolrJ提供了用于索引Java bean的API。要为bean建立索引,我们需要使用@Field对其进行注解::

    public class Item {
    
        @Field
        private String id;
    
        @Field
        private String description;
    
        @Field
        private String category;
    
        @Field
        private float price;
    }

    一旦我们添加bean,索引就已经建立好:

    solrClient.addBean(item); 
    solrClient.commit();

    4. Solr查询

    搜索是Solr最强大的功能。我们一旦在存储库中建立索引文档,我们就可以根据关键字,短语,日期范围等进行搜索。结果按相关性(得分)排序。

    4.1 基本查询

    服务器公开用于搜索操作的API。我们可以调用/select或/query程序处理请求。

    我们来做一个简单的搜索:

    SolrQuery query = new SolrQuery();
    query.setQuery("brand1");
    query.setStart(0);
    query.setRows(10);
    
    QueryResponse response = solrClient.query(query);
    List<Item> items = response.getBeans(Item.class);

    SolrJ将在其对服务器的请求内部使用主查询参数q。返回记录的数量为10,未指定start和rows参数时,从0开始索引。

    上面的搜索查询将查找在其任何索引字段中包含完整单词“brand1”的任何文档。请注意,简单搜索不区分大小写。

    让我们看另一个例子。我们想要搜索任何包含“rand”的单词,该单词以任意数量的字符开头,并且只以一个字符结尾。我们可以在查询中使用*和?通配符:

    query.setQuery("*rand?");

    Solr查询还支持类似SQL中的布尔操作:

    query.setQuery("brand1 AND (Washing OR Refrigerator)");

    所有布尔运算符必须全部大写;查询解析器支持的是AND,OR,NOT, 和 - 。

    更重要的是,如果我们想要搜索特定字段而不是所有索引字段,我们可以在查询中指定这些字段:

    query.setQuery("description:Brand* AND category:*Washing*");

    4.2 短语查询

    到目前为止,我们只用代码在索引字段中查找关键字。我们还可以对索引字段进行短语搜索:

    query.setQuery("Washing Machine");

    当我们有一个像“Washing Machine”这样的短语时,Solr的标准查询解析器将其解析为“Washing OR Machine”。要搜索整个短语,我们只能在双引号内添加表达式:

    query.setQuery("\"Washing Machine\"");

    我们可以使用邻近搜索来查找特定距离内的单词。如果我们想要找到至少相距两个单词的短语,我们可以使用以下查询:

    query.setQuery("\"Washing equipment\"~2");

    4.3 范围查询

    范围查询允许获取其字段在特定范围之间的文档。假设我们想要找到价格在100到300之间的商品:

    query.setQuery("price:[100 TO 300]");

    上面的查询将找到价格在100到300之间的所有元素,包括100和300。我们可以使用“}”和“{”来排除终点:

    query.setQuery("price:{100 TO 300]");

    4.4 过滤查询

    筛选查询可用于限制可返回的结果的超集。过滤查询不会影响排序:

    SolrQuery query = new SolrQuery();
    query.setQuery("price:[100 TO 300]");
    query.addFilterQuery("description:Brand1","category:Home Appliances");

    通常,过滤器查询将包含常用查询。由于它们通常是可重用的,因此它们被缓存以使搜索更有效。

    5. 分面搜索

    Faceting有助于将搜索结果安排到组计数中。我们可以使用字段,查询或范围。

    5.1. Field 切面

    例如,我们希望在搜索结果中获取聚合的类别计数。我们可以在查询中添加类别字段:

    query.addFacetField("category");
    
    QueryResponse response = solrClient.query(query);
    List<Count> facetResults = response.getFacetField("category").getValues();

    facetResults将包含结果中每个类别的计数。

    5.2. 切面查询

    当我们想要返回子查询的计数时,查询切面非常有用:

    query.addFacetQuery("Washing OR Refrigerator");
    query.addFacetQuery("Brand2");
    
    QueryResponse response = solrClient.query(query);
    Map<String,Integer> facetQueryMap = response.getFacetQuery();

    因此,facetQueryMap将具有facet查询的计数。

    5.3. 范围切面

    范围切面用于获取搜索结果中的范围计数。以下查询将返回介于100和251之间的价格范围计数,其间隔为25:

    query.addNumericRangeFacet("price", 100, 275, 25);
    
    QueryResponse response = solrClient.query(query);
    List<RangeFacet> rangeFacets =  response.getFacetRanges().get(0).getCounts();

    除数值范围外,Solr还支持日期范围,区间切面和支点切面。

    6. 突出显示

    我们可能希望在搜索结果中突出显示搜索查询中的关键字。这对于更好地了解结果非常有帮助。让我们索引一些文档并定义要突出显示的关键字:

    itemSearchService.index("hm0001", "Brand1 Washing Machine", "Home Appliances", 100f);
    itemSearchService.index("hm0002", "Brand1 Refrigerator", "Home Appliances", 300f);
    itemSearchService.index("hm0003", "Brand2 Ceiling Fan", "Home Appliances", 200f);
    itemSearchService.index("hm0004", "Brand2 Dishwasher", "Washing equipments", 250f);
    
    SolrQuery query = new SolrQuery();
    query.setQuery("Appliances");
    query.setHighlight(true);
    query.addHighlightField("category");
    QueryResponse response = solrClient.query(query);
    
    Map<String, Map<String, List<String>>> hitHighlightedMap = response.getHighlighting();
    Map<String, List<String>> highlightedFieldMap = hitHighlightedMap.get("hm0001");
    List<String> highlightedList = highlightedFieldMap.get("category");
    String highLightedText = highlightedList.get(0);

    我们获取到的highLightedText为"Home Appliances "。请注意,搜索关键字Appliances被标记。 Solr使用的默认突出显示标记是,但我们可以通过设置pre和post标记来更改它:

    query.setHighlightSimplePre("<strong>");
    query.setHighlightSimplePost("</strong>");

    7. 搜索建议

    Solr支持的一个重要功能是建议。如果查询中的关键字包含拼写错误,或者我们建议自动填写搜索关键字,我们可以使用建议功能。

    7.1. 拼写检查

    标准搜索处理程序不包括拼写检查组件;它必须手动配置。有三种方法可以做到这一点。您可以在官方wiki page中找到配置详细信息。在我们的示例中,我们将使用IndexBasedSpellChecker,它使用索引数据进行关键字拼写检查。

    让我们搜索拼写错误的关键字:

    query.setQuery("hme");
    query.set("spellcheck", "on");
    QueryResponse response = solrClient.query(query);
    
    SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse();
    Suggestion suggestion = spellCheckResponse.getSuggestions().get(0);
    List<String> alternatives = suggestion.getAlternatives();
    String alternative = alternatives.get(0);

    关键字“hme”的预期替代应该是“home”,因为我们的索引包含术语“home”。请注意,必须在执行搜索之前激活拼写检查。

    7.2. 自动建议条件

    我们可能希望获得不完整关键字的建议以协助搜索。 Solr的建议组件必须手动配置。您可以在其官方wiki page中找到配置详细信息。

    我们已经配置了一个名为/suggest的请求处理程序来处理建议。让我们得到关键字“Hom”的建议:

    SolrQuery query = new SolrQuery();
    query.setRequestHandler("/suggest");
    query.set("suggest", "true");
    query.set("suggest.build", "true");
    query.set("suggest.dictionary", "mySuggester");
    query.set("suggest.q", "Hom");
    QueryResponse response = solrClient.query(query);
    
    SuggesterResponse suggesterResponse = response.getSuggesterResponse();
    Map<String,List<String>> suggestedTerms = suggesterResponse.getSuggestedTerms();
    List<String> suggestions = suggestedTerms.get("mySuggester");

    列表建议应包含所有单词和短语。请注意,我们在配置中配置了名为mySuggester的建议器。

    8. 结束语

    本文简要介绍了搜索引擎的Solr功能和特性。

    我们谈到了许多功能,但这些当然只是表现了我们可以使用高级和成熟的搜索服务器(如Solr)所做的事情。

    这里使用的示例可以在GitHub上使用。

    展开全文
  • 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全文检索实现原理详谈,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Solr全文检索服务器

    2019-05-07 09:53:07
    而是使用solr或es全文检索服务器 因为数据库模糊搜索的效率低,速度慢。【不能拆分关键字进行检索】 不能支持搜索的关键字高亮显示。 不能实现标题与正文合并检索关键字【即使标题中没有这个要检索的关键字,但是...

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

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

     

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

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

     


    SolrJ

    SolrJ是java操作solr的客户端

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

    展开全文
  • solr全文检索实现原理

    2021-02-24 12:06:59
    Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引...其中Lucene全文检索的基本原理,跟大牛讲的web搜索课程里的
  • solr全文检索+IK分词器

    2017-06-30 09:10:11
    solr全文检索整合ik中文分析器的配置实现搜索引擎,已在项目中使用过,可以共用
  • solr全文检索环境搭建

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

    2017-11-12 12:19:56
    Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。  Solr可以独立运行,...
    1、什么是Solr
    Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。 
    Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。

    2、Solr和Lucene的区别


    3、Solr的安装

    第一步:把solr的压缩包解压缩。、
    第二步:安装tomcat。
    第三步:把solr-4.10.3\dist目录下的solr-4.10.3.war部署到tomcat下。把war包改名为solr.war(改名不是必须的,为了便于访问)
    第四步:解压solr.war,启动tomcat自动解压。关闭tomcat,删除solr.war
    第五步:把\solr-4.10.3\example\lib\ext目录下的所有的jar包添加到solr工程中。
    第六步:需要一个solrhome,solrhome就是solr服务器所有的配置文件存放的目录。可以使用solr-4.10.3\example\solr目录做为solrhome。
    第七步:配置solr服务,指定solrhome的位置。告诉solr服务solrhome在哪儿。需要修改solr工程的web.xml文件。
    第八步:启动tomcat。访问:http://localhost:8080/solr/


    4、Solr后台介绍
    4.1、Core Admin
    在此功能中可以查看solrcore的情况。
    4.2、Core selector
    在此处可以选择要管理的solrcore。
    4.3、Analysis
    分析功能。可以查看分析器的分词效果。
    4.4、Dataimport
    可以配置dataimport插件把数据库中的数据导入到索引库中。
    4.5、Documents
    可以使用此功能实现索引库的维护,增删改功能。
    4.6、Query
    查询索引库。

    5、SolrJ的使用
    Solr的客户端。
    5.1、添加文档:
    第一步:创建一个java工程。
    第二步:把solrJ相关的jar包添加到工程中。
    第三步:使用SolrServer和solr服务端创建一个连接。SolrServer是一个抽象类,单机版使用HttpSolrServer,如果solr集群,使用CloudSolrServer。
    第四步:创建一个文档对象SolrInputDocument对象。
    第五步:向文档对象中添加域。必须包含id域,域名称必须在schema.xml中定义。
    第六步:使用SolrServer对象把文档添加到索引库。
    第七步:提交。Commit。
    5.2、删除文档:
    根据id删除;
    根据查询删除
    5.3、更新文档:
    5.4、查询文档:
    简单查询;
    复杂查询

    展开全文
  • solr全文检索开发

    2013-12-02 23:53:44
    solr 是一款全文检索搜索引擎的开源项目,基于java 开发,可实现全文检索,地里信息定位服务的实现等。
  • 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包: ...
  • solr全文检索服务器的应用 1.Solr安装与配置 1.1什么是Solr 大多数搜索引擎应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗并且它们由于沉重的数据库加载而拖垮你的应用的性能。 这就是为什么转移...
  • Solr是Apache的顶级开源项目,使用java开发 ,基于Lucene的全文检索服务器。 Solr比Lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对Lucene的性能进行了优化。
  • solr全文检索中需要用到的apache-solr-1.4.1.zip
  • Solr全文检索框架

    2019-04-19 11:28:00
    概述:  什么是Solr? Solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务.Solr... 全文检索服务(也叫做全文搜索): 服务 是War包. ES框架 也是基于Lucene,Lucene(是工具包 jar)  ...
  • 本次将介绍solr全文检索服务器的搭建和基本使用,下面将从服务器搭建、schema配置、solrj与spring整合、solrj简单使用等几个方面介绍
  • linux环境搭建solr全文检索服务第一步:安装tomcattomcat下载地址:https://pan.baidu.com/s/1fW-wJqgUu74P0UJTp6Of5w 密码:pc86第二步:将solr-4.10.3.tgz.tgz 上传到linux 并解压缩工具下载地址:...
  • solr 全文检索服务器

    2017-07-08 08:30:45
    Solr和lucene有什么区别了...是java开发的,是基于lucene的全文检索solr相比较而言提供了更多的查询语句,性能也有所优化,具体的优化还是需要参考源代码的。2.solr的索引流程:客户端(浏览器)–post请求-》服务端
  • solr全文检索入门

    千次阅读 2019-01-09 12:09:57
    文章目录安装启动创建core配置core索引MySQL数据3.2.13.2.23.2.3测试定时更新五、配置中文分词SolrJ ...从官网下载Solr7.4(或本资源包内直接解压,本包内也是官网下载的) 下载地址:https://mirrors.tuna.tsinghu...
  • Solr 是apache 的一个顶级开源项目,采用java开发,它是基于Lucene的全文检索服务器,solr 提供了比Lucene更为丰富的查询语言,同时实现了可配置可扩展,并对索引,搜索性能进行了优化 Linux 下安装Solr 解压Solr ...
  • 框架 day71 Solr 全文检索服务 入门

    千次阅读 2016-07-30 23:34:18
    Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。 Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并...
  • springboot+solr 全文检索

    2020-12-09 19:05:50
    1.把 solr-8.1.1.tgz 传到服务器 //把文件传到 /usr/local 目录下 cd /usr/local 2.解压 solr tar -xzf solr-8.1.1.tgz 3.启动 solr cd /usr/local/solr-8.1.1 # 不建议使用管理员启动 solr,加 -force 强制启动 ...
  •   那么我们首先要知道Solr是什么,我们都知道我们国内目前很火的某猫,某宝,某东,在这里就用到了Solr检索服务器。百度百科给出的解释是:Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的...
  • solr全文检索中需要的mmseg4j-1[1].8.4.zip
  • 1 solr服务搭建 1.1 solr环境准备 Solr是java开发的,需要安装jdk。 需要solr的安装文件。 安装环境Linux。 需要安装Tomcat。   1.2 solr安装 第二步:解压solr。 第三步:安装Tomcat,解压缩即可。 第四...

空空如也

空空如也

1 2 3 4 5 ... 20