solr 订阅
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。 展开全文
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
信息
外文名
Solr
类    型
计算机语言开发
中文名
企业级搜索应用服务器
功    能
提供API接口
Solr特点
Solr是一个高性能,采用Java开发, 基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
收起全文
精华内容
参与话题
问答
  • Solr

    千次阅读 2019-12-23 15:45:34
    什么是solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。 Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。 Solr可以...

    什么是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的配置和运行情况。

    Solr与Lucene的区别

    Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎。

    Solr的目标是打造一款企业级的搜索引擎系统,它是一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。
    在这里插入图片描述

    Solr安装及配置

    Solr下载

    从Solr官方网站(http://lucene.apache.org/solr/ )下载Solr4.10.3,根据Solr的运行环境,Linux下需要下载lucene-4.10.3.tgz,windows下需要下载lucene-4.10.3.zip。

    Solr使用指南可参考:https://wiki.apache.org/solr/FrontPage

    Solr文件夹结构

    将solr-4.10.3.zip解压
    在这里插入图片描述
    bin:solr的运行脚本
    contrib:solr的一些贡献软件/插件,用于增强solr的功能。
    dist:该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。
    docs:solr的API文档
    example:solr工程的例子目录:

    • example/solr:该目录是一个包含了默认配置信息的Solr的Core目录。
    • example/multicore:该目录包含了在Solr的multicore中设置的多个Core目录。
    • example/webapps:该目录中包括一个solr.war,该war可作为solr的运行实例工程。

    licenses:solr相关的一些许可信息

    运行环境

    solr 需要运行在一个Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr默认提供Jetty(java写的Servlet容器),本教程使用Tocmat作为Servlet容器,环境如下:

    Solr:Solr4.10.3
    Jdk:jdk1.7.0_72
    Tomcat:apache-tomcat-7.0.53
    

    Solr整合Tomcat

    Solr Home与SolrCore

    创建一个Solr home目录,SolrHome是Solr运行的主目录,目录中包括了运行Solr实例所有的配置文件和数据文件,Solr实例就是SolrCore,一个SolrHome可以包括多个SolrCore(Solr实例),每个SolrCore提供单独的搜索和索引服务。

    example\solr是一个solr home目录结构,如下:
    在这里插入图片描述
    上图中“collection1”是一个SolrCore(Solr实例)目录 ,目录内容如下所示:
    在这里插入图片描述
    说明:

    • collection1:叫做一个Solr运行实例SolrCore,SolrCore名称不固定,一个solr运行实例对外单独提供索引和搜索接口。
    • solrHome中可以创建多个solr运行实例SolrCore。
    • 一个solr的运行实例对应一个索引目录。
    • conf是SolrCore的配置文件目录 。
    • data目录存放索引文件需要创建。

    整合步骤(安装solr)

    • 第一步:安装tomcat。D:\temp\apache-tomcat-7.0.53
    • 第二步:把solr的war包复制到tomcat 的webapp目录下。
      把\solr-4.10.3\dist\solr-4.10.3.war复制到D:\temp\apache-tomcat-7.0.53\webapps下。 改名为solr.war
    • 第三步:solr.war解压。使用压缩工具解压或者启动tomcat自动解压。解压之后删除solr.war
    • 第四步:把\solr-4.10.3\example\lib\ext目录下的所有的jar包添加到solr工程中
    • 第五步:配置solrHome和solrCore。
      1)创建一个solrhome(存放solr所有配置文件的一个文件夹)。\solr-4.10.3\example\solr目录就是一个标准的solrhome。
      2)把\solr-4.10.3\example\solr文件夹复制到D:\temp路径下,改名为solrhome,改名不是必须的,是为了便于理解。
      3)在solrhome下有一个文件夹叫做collection1这就是一个solrcore。就是一个solr的实例。一个solrcore相当于mysql中一个数据库。Solrcore之间是相互隔离。

    在solrcore中有一个文件夹叫做conf,包含了索引solr实例的配置信息。

    在conf文件夹下有一个solrconfig.xml。配置实例的相关信息。如果使用默认配置可以不用做任何修改。

    Xml的配置信息
    lib:solr服务依赖的扩展包,默认的路径是collection1\lib文件夹,如果没有 就创建一个
    dataDir:配置了索引库的存放路径。默认路径是collection1\data文件夹,如 果没有data文件夹,会自动创建。
    requestHandler
    在这里插入图片描述
    在这里插入图片描述

    • 第六步:告诉solr服务器配置文件也就是solrHome的位置。修改web.xml使用jndi的方式告诉solr服务器。
      Solr/home名称必须是固定的。
      在这里插入图片描述
      在这里插入图片描述
    • 第七步:启动tomcat
    • 第八步:访问http://localhost:8080/solr/

    Solr后台管理

    管理界面

    在这里插入图片描述

    Dashboard

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

    Logging

    Solr运行日志信息

    Cloud

    Cloud即SolrCloud,即Solr云(集群),当使用Solr Cloud模式运行时会显示此菜单,如下图是Solr Cloud的管理界面:
    在这里插入图片描述

    Core Admin

    Solr Core的管理界面。Solr Core 是Solr的一个独立运行实例单位,它可以对外提供索引和搜索服务,一个Solr工程可以运行多个SolrCore(Solr实例),一个Core对应一个索引目录。

    添加solrcore

    第一步:复制collection1改名为collection2
    第二步:修改core.properties。name=collection2
    第三步:重启tomcat
    

    java properties

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

    Tread Dump

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

    Core selector

    选择一个SolrCore进行详细操作,如下:
    在这里插入图片描述

    Analysis

    在这里插入图片描述
    通过此界面可以测试索引分析器和搜索分析器的执行情况。

    Dataimport

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

    Document

    通过此菜单可以创建索引、更新索引、删除索引等操作 界面如下:
    在这里插入图片描述
    /update表示更新索引,solr默认根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新。

    Query

    在这里插入图片描述
    通过/select执行搜索索引,必须指定“q”查询条件方可搜索。

    配置中文分析器

    Schema.xml

    schema.xml,在SolrCore的conf目录下,它是Solr数据表配置文件,它定义了加入索引的数据的数据类型的。主要包括FieldTypes、Fields和其他的一些缺省设置。
    在这里插入图片描述

    FieldType域类型定义

    下边“text_general”是Solr默认提供的FieldType,通过它说明FieldType定义的内容:
    在这里插入图片描述
    FieldType子结点包括:name,class,positionIncrementGap等一些参数:
    name:是这个FieldType的名称
    class:是Solr提供的包solr.TextField,solr.TextField 允许用户通过分析器来定制索引和查询,分析器包括一个分词器(tokenizer)和多个过滤器(filter)
    positionIncrementGap:可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误,此值相当于Lucene的短语查询设置slop值,根据经验设置为100。

    在FieldType定义的时候最重要的就是定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤

    索引分析器中:使用solr.StandardTokenizerFactory标准分词器,solr.StopFilterFactory停用词过滤器,solr.LowerCaseFilterFactory小写过滤器。

    搜索分析器中:使用solr.StandardTokenizerFactory标准分词器,solr.StopFilterFactory停用词过滤器,这里还用到了solr.SynonymFilterFactory同义词过滤器。

    Field定义

    在fields结点内定义具体的Field,filed定义包括name,type(为之前定义过的各种FieldType),indexed(是否被索引),stored(是否被储存),multiValued(是否存储多个值)等属性。

    <field name="name" type="text_general" indexed="true" stored="true"/>
    <field name="features" type="text_general" indexed="true" stored="true" multiValued="true"/>
    

    multiValued:该Field如果要存储多个值时设置为true,solr允许一个Field存储多个值,比如存储一个用户的好友id(多个),商品的图片(多个,大图和小图),通过使用solr查询要看出返回给客户端是数组:
    在这里插入图片描述

    uniqueKey

    Solr中默认定义唯一主键key为id域
    在这里插入图片描述
    Solr在删除、更新索引时使用id域进行判断,也可以自定义唯一主键。
    注意在创建索引时必须指定唯一约束。

    copyField复制域

    copyField复制域,可以将多个Field复制到一个Field中,以便进行统一的检索
    比如,输入关键字搜索title标题内容content,
    定义title、content、text的域:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    根据关键字只搜索text域的内容就相当于搜索title和content,将title和content复制到text中
    在这里插入图片描述

    dynamicField(动态字段)

    动态字段就是不用指定具体的名称,只要定义字段名称的规则,例如定义一个 dynamicField,name 为*_i,定义它的type为text,那么在使用这个字段的时候,任何以_i结尾的字段都被认为是符合这个定义的,例如:name_i,gender_i,school_i等。

    自定义Field名为:product_title_t,“product_title_t”和scheam.xml中的dynamicField规则匹配成功
    在这里插入图片描述
    “product_title_t”是以“_t”结尾。

    创建索引
    在这里插入图片描述
    搜索索引
    在这里插入图片描述

    安装中文分词器

    使用IKAnalyzer中文分析器
    第一步:把IKAnalyzer2012FF_u1.jar添加到solr/WEB-INF/lib目录下。
    第二步:复制IKAnalyzer的配置文件和自定义词典和停用词词典到solr的classpath下。
    第三步:在schema.xml中添加一个自定义的fieldType,使用中文分析器。

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

    第四步:定义field,指定field的type属性为text_ik

    <!--IKAnalyzer Field-->
    <field name="title_ik" type="text_ik" indexed="true" stored="true" />
    <field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
    

    第四步:重启tomcat
    在这里插入图片描述

    模拟业务系统Field

    如果不使用Solr提供的Field可以针对具体的业务需要自定义一套Field,如下是商品信息 Field

    <!--product-->
    <field name="product_name" type="text_ik" indexed="true" stored="true"/>
    <field name="product_price"  type="float" indexed="true" stored="true"/>
    <field name="product_description" type="text_ik" indexed="true" stored="false" />
    <field name="product_picture" type="string" indexed="false" stored="true" />
    <field name="product_catalog_name" type="string" indexed="true" stored="true" />
    
    <field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
    <copyField source="product_name" dest="product_keywords"/>
    <copyField source="product_description" dest="product_keywords"/>
    

    Solr管理索引库

    添加/更新文档

    添加单个文档
    在这里插入图片描述
    批量导入数据
    使用dataimport插件批量导入数据。
    第一步:把dataimport插件依赖的jar包添加到solrcore(collection1\lib)中
    在这里插入图片描述
    还需要mysql的数据库驱动。
    第二步:配置solrconfig.mxl文件,添加一个requestHandler。

    <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
        <lst name="defaults">
    		<str name="config">data-config.xml</str>
        </lst>
    </requestHandler> 
    

    第三步:创建一个data-config.xml,保存到collection1\conf\目录下

    <?xml version="1.0" encoding="UTF-8" ?>  
    <dataConfig>   
    <dataSource type="JdbcDataSource"   
    		  driver="com.mysql.jdbc.Driver"   
    		  url="jdbc:mysql://localhost:3306/lucene"   
    		  user="root"   
    		  password="root"/>   
    <document>   
    	<entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products ">
    		 <field column="pid" name="id"/> 
    		 <field column="name" name="product_name"/> 
    		 <field column="catalog_name" name="product_catalog_name"/> 
    		 <field column="price" name="product_price"/> 
    		 <field column="description" name="product_description"/> 
    		 <field column="picture" name="product_picture"/> 
    	</entity>   
    </document>   
    
    </dataConfig>
    

    第四步:重启tomcat
    在这里插入图片描述
    第五步:点击“execute”按钮导入数据
    到入数据前会先清空索引库,然后再导入。

    删除文档

    1) 删除制定ID的索引

    <delete>
    	<id>8</id>
    </delete>
    

    2) 删除查询到的索引数据

    <delete>
    	<query>product_catalog_name:幽默杂货</query>
    </delete>
    

    3) 删除所有索引数据

     <delete>
    	<query>*:*</query>
    </delete>
    

    查询索引

    通过/select搜索索引,Solr制定一些参数完成不同需求的搜索:

    1. q - 查询字符串,必须的,如果查询所有使用*:*
      在这里插入图片描述
    2. fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的
      在这里插入图片描述
      过滤查询价格从1到20的记录。
      也可以在“q”查询条件中使用product_price:[1 TO 20]
      在这里插入图片描述
      也可以使用“*”表示无限,例如:
      20以上:product_price:[20 TO ]
      20以下:product_price:[
      TO 20]
    3. sort - 排序,格式:sort=+<desc|asc>[,+<desc|asc>]…
      在这里插入图片描述
    4. start - 分页显示使用,开始记录下标,从0开始
    5. rows - 指定返回结果最多有多少条记录,配合start来实现分页
      在这里插入图片描述
      显示前10条。
    6. fl - 指定返回那些字段内容,用逗号或空格分隔多个
      在这里插入图片描述
      显示商品图片、商品名称、商品价格
    7. df-指定一个搜索Field
      在这里插入图片描述
      也可以在SolrCore目录 中conf/solrconfig.xml文件中指定默认搜索Field,指定后就可以直接在“q”查询条件中输入关键字。
      在这里插入图片描述
    8. wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开
    9. hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀
      在这里插入图片描述

    SolrJ管理索引库

    什么是solrJ

    solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务
    在这里插入图片描述

    依赖的jar包

    在这里插入图片描述

    添加文档

    第一步:创建一个java工程
    第二步:导入jar包。包括solrJ的jar包。还需要
    在这里插入图片描述
    第三步:和Solr服务器建立连接。HttpSolrServer对象建立连接。
    第四步:创建一个SolrInputDocument对象,然后添加域。
    第五步:将SolrInputDocument添加到索引库。
    第六步:提交。

    @Test
    public void testAddDocument() throws Exception {
    	// 创建一个SolrServer对象,创建连接
    	// 参数:solr服务的地址
    	// http://localhost:8080/solr :默认为collection1
    	// http://localhost:8080/solr/collection2 :连接collection2
    	SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    	// 创建一个文档对象
    	SolrInputDocument document = new SolrInputDocument();
    	// 向文档中添加域
    	// 每个文档必须有id域,而且其他域必须在schema.xml中定义
    	document.addField("id", "test001");
    	document.addField("product_name", "测试商品");
    	document.addField("product_price", "100");
    	// 把文档添加到索引库
    	solrServer.add(document);
    	// 提交
    	solrServer.commit();
    }
    

    删除文档

    根据id删除

    @Test
    public void testDeleteDocumentById() throws Exception {
    	SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    	// 根据id删除文档
    	solrServer.deleteById("test001");
    	// 提交
    	solrServer.commit();
    }
    

    根据查询删除

    查询语法完全支持Lucene的查询语法。

    @Test
    public void testDeleteDocumentByQuery() throws Exception {
    	SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    	// 参数:查询语法
    	solrServer.deleteByQuery("*:*");
    	// 提交
    	solrServer.commit();
    }
    

    修改文档

    在solrJ中修改没有对应的update方法,只有add方法,只需要添加一条新的文档,和被修改的文档id一致就,可以修改了。本质上就是先删除后添加。

    查询文档

    简单查询

    @Test
    public void testQueryIndex() throws Exception {
    	SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    	// 创建一个SolrQuery对象
    	SolrQuery query = new SolrQuery();
    	// 设置查询条件
    	// query.set("q", "*:*");
    	query.setQuery("*:*");
    	// 执行查询
    	QueryResponse response = solrServer.query(query);
    	// 取查询结果
    	SolrDocumentList solrDocumentList = response.getResults();
    	System.out.println("查询结果总记录数:" + solrDocumentList.getNumFound());
    	// 遍历查询结果
    	for (SolrDocument solrDocument : solrDocumentList) {
    		System.out.println(solrDocument.get("id"));
    		System.out.println(solrDocument.get("product_name"));
    		System.out.println(solrDocument.get("product_price"));
    		System.out.println(solrDocument.get("product_catalog_name"));
    		System.out.println(solrDocument.get("product_picture"));
    	}
    }
    

    复杂查询

    其中包含查询、过滤、分页、排序、高亮显示等处理。

    @Test
    public void testQueryIndexFuza() throws Exception {
    	SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    	// 创建一个查询对象
    	SolrQuery query = new SolrQuery();
    	// 设置主查询条件
    	query.setQuery("厨房");
    	// 设置过滤条件
    	query.addFilterQuery("product_price:[0 TO 20]");
    	// 排序
    	// 参数1:要排序的域, 参数2:排序方式
    	query.setSort("product_price", ORDER.asc);
    	// 设置分页
    	query.setStart(0);
    	query.setRows(5);
    	// 设置返回结果包含的域
    	query.setFields("id", "product_name", "product_price", "product_catalog_name", "product_picture");
    	// 设置默认搜索域
    	query.set("df", "product_keywords");
    	// 开启高亮
    	query.setHighlight(true);
    	// 高亮显示的域
    	query.addHighlightField("product_name");
    	// 高亮前缀
    	query.setHighlightSimplePre("<em>");
    	// 高亮后缀
    	query.setHighlightSimplePost("</em>");
    	// 执行查询
    	QueryResponse response = solrServer.query(query);
    	// 取查询结果
    	SolrDocumentList solrDocumentList = response.getResults();
    	System.out.println("查询结果总记录数:" + solrDocumentList.getNumFound());
    	// 遍历查询结果
    	for (SolrDocument solrDocument : solrDocumentList) {
    		System.out.println(solrDocument.get("id"));
    		// 取高亮显示
    		Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
    		List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
    		String productName = "";
    		if (list != null && list.size() > 0) {
    			productName = list.get(0);
    		} else {
    			productName = (String) solrDocument.get("product_name");
    		}
    		System.out.println(productName);
    		System.out.println(solrDocument.get("product_price"));
    		System.out.println(solrDocument.get("product_catalog_name"));
    		System.out.println(solrDocument.get("product_picture"));
    	}
    }
    
    展开全文
  • solr

    千次阅读 2017-12-07 20:55:36
    Solr7.1---Getting Start 目前最新版的Solr是7.1.0 有个我还不清楚的地方是,为何5.5.X或者6.6.X版本还在更新,给我的感觉好像每一个大版本都有自己的维护团队。不管了。 首先-系统要求 JDK1.8+   解压Solr...

    Solr7.1---Getting Start

    目前最新版的Solr是7.1.0

    有个我还不清楚的地方是,为何5.5.X或者6.6.X版本还在更新,给我的感觉好像每一个大版本都有自己的维护团队。不管了。

    首先-系统要求

    JDK1.8+

     

    解压Solr

    ~$ unzip -q solr-7.1.0.zip
    
    ~$ cd solr-7.1.0/

    以SolrCloud模式启动

    Unix或MacOS:bin/solr start -e cloud
    Windows:bin\solr.cmd start -e cloud

    进入目录-启动【Linux仅仅命令不同】

    D:\>cd solr-7.1.0
    
    D:\solr-7.1.0>bin\solr.cmd start -e cloud
    
    Welcome to the SolrCloud example!
    
    This interactive session will help you launch a SolrCloud cluster on your local
    workstation.
    To begin, how many Solr nodes would you like to run in your local cluster? (spec
    ify 1-4 nodes) [2]:

    这个时候直接回车Enter

    Ok, let's start up 2 Solr nodes for your example SolrCloud cluster.
    Please enter the port for node1 [8983]:

    再Enter

    Please enter the port for node2 [7574]:

    Enter,后面直接出现这么一大段

    Creating Solr home directory D:\solr-7.1.0\example\cloud\node1\solr
    Cloning D:\solr-7.1.0\example\cloud\node1 into
       D:\solr-7.1.0\example\cloud\node2
    
    Starting up Solr on port 8983 using command:
    "D:\solr-7.1.0\bin\solr.cmd" start -cloud -p 8983 -s "D:\solr-7.1.0\example\clou
    d\node1\solr"
    
    Waiting up to 30 to see Solr running on port 8983
    Started Solr server on port 8983. Happy searching!
    
    Starting up Solr on port 7574 using command:
    "D:\solr-7.1.0\bin\solr.cmd" start -cloud -p 7574 -s "D:\solr-7.1.0\example\clou
    d\node2\solr" -z localhost:9983
    
    Waiting up to 30 to see Solr running on port 7574
    INFO  - 2017-11-03 09:37:54.245; org.apache.solr.client.solrj.impl.ZkClientClust
    erStateProvider; Cluster at localhost:9983 ready
    
    Now let's create a new collection for indexing documents in your 2-node cluster.
    
    Please provide a name for your new collection: [gettingstarted]
    Started Solr server on port 7574. Happy searching!

    最后一段话:系统提示你创建一个用于索引数据的集合。因为Solr提供一些样本数据,我们不妨与教程一致,在控制台输入techproducts 然后回车。

    techproducts
    How many shards would you like to split techproducts into? [2]

    然后会让你输入想分割到两个节点上的碎片数量。这里默认为2,就是均匀分割到两个节点上。【我们目前有两个节点,所以2就是平均分。如果我们建立三个节点,那么想要平均分就要输入3】。直接回车。

    How many replicas per shard would you like to create? [2]

    你想为每个碎片创建多少副本?【副本是用来故障切换的】这里默认2,回车

    Please choose a configuration for the techproducts collection, available options
     are:
    _default or sample_techproducts_configs [_default]

    这里让我们选择一个配置。在本地我也找到了这两个目录

    Solr有两个开箱即用的配置文件样本集,称为“configSet”。而索引集合必须有一个“ConfigSet”。它包括两个主要配置文件:

    大家注意 sample_techproducts_configs ,它包括了我们定义的索引集合名称:techproducts。这个config包含了我们需要的示例数据。所以在控制台上输入sample_techproducts_configs并回车【可能会慢一点,耐心】:

    sample_techproducts_configs
    Created collection 'techproducts' with 2 shard(s), 2 replica(s) with config-set
    'techproducts'
    
    Enabling auto soft-commits with maxTime 3 secs using the Config API
    
    POSTing request to Config API: http://localhost:8983/solr/techproducts/config
    {"set-property":{"updateHandler.autoSoftCommit.maxTime":"3000"}}
    Successfully set-property updateHandler.autoSoftCommit.maxTime to 3000
    
    
    SolrCloud example running, please visit: http://localhost:8983/solr
    
    
    D:\solr-7.1.0>

    最后来访问:

    http://localhost:8983/solr
    
    
    

    Solr现在将运行两个“节点”,一个在端口7574上,一个在端口8983上。一个集合techproducts,两个分片集合,每个都有两个副本。【点击Cloud可见】

     

     到此Solr已经启动啦,可是还没有数据。下面来完成

     

    加入数据

    Linux:solr-7.1.0:$ bin/post -c techproducts example/exampledocs/*
    
    Windows:D:\solr-7.1.0> java -jar -Dc=techproducts -Dauto example\exampledocs\post.jar example\exampledocs\*

    结果:

    D:\solr-7.1.0>java -jar -Dc=techproducts -Dauto example\exampledocs\post.jar exa
    mple\exampledocs\*
    SimplePostTool version 5.0.0
    Posting files to [base] url http://localhost:8983/solr/techproducts/update...
    Entering auto mode. File endings considered are xml,json,jsonl,csv,pdf,doc,docx,
    ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log
    POSTing file books.csv (text/csv) to [base]
    POSTing file books.json (application/json) to [base]/json/docs
    POSTing file gb18030-example.xml (application/xml) to [base]
    POSTing file hd.xml (application/xml) to [base]
    POSTing file ipod_other.xml (application/xml) to [base]
    POSTing file ipod_video.xml (application/xml) to [base]
    POSTing file manufacturers.xml (application/xml) to [base]
    POSTing file mem.xml (application/xml) to [base]
    POSTing file money.xml (application/xml) to [base]
    POSTing file monitor.xml (application/xml) to [base]
    POSTing file monitor2.xml (application/xml) to [base]
    POSTing file more_books.jsonl (application/json) to [base]/json/docs
    POSTing file mp500.xml (application/xml) to [base]
    POSTing file post.jar (application/octet-stream) to [base]/extract
    POSTing file sample.html (text/html) to [base]/extract
    POSTing file sd500.xml (application/xml) to [base]
    POSTing file solr-word.pdf (application/pdf) to [base]/extract
    POSTing file solr.xml (application/xml) to [base]
    POSTing file test_utf8.sh (application/octet-stream) to [base]/extract
    POSTing file utf8-example.xml (application/xml) to [base]
    POSTing file vidcard.xml (application/xml) to [base]
    21 files indexed.
    COMMITting Solr index changes to http://localhost:8983/solr/techproducts/update.
    ..
    Time spent: 0:00:06.768
    
    D:\solr-7.1.0>

     基本搜索

     访问:http://localhost:8983/solr/#/techproducts/query

     

    点击Execute Query。开始查询,你会发现右边有好几条JSON数据。准确来说:是十条

    右上角是发送的URL,你可以点击它,点击试试看

     

    查询参数解释:

    修改q为foundation,结果显示有四个命中。

    将id放入fl中,再次查询,你会发现显示的字段只有id

     我们再改变p为electronics,有14个结果。

     

    这种查询是在所有索引字段查询包括electronics字段的文档,如果想更精确一点,我们看到有一个cat字段,那么将p改为cat:electronics,意思为仅仅cat字段中包含electronics信息的数据。

    可以看到,只有12条数据,更加精确了。

     

    下面进行短语搜索

     p改为"multiple terms here",短语搜索必需加上双引号。

     

     

    最后

     如果你希望删除此集合

    D:\solr-7.1.0> bin\solr delete -c techproducts

     

    注意:Linux的路径为/

     

    停止启动的Solr

    D:\solr-7.1.0> bin\solr stop -all

     

    本宝宝写的文章不一定是精华,但是希望对你有帮助,每一篇文章都是本宝宝亲自手写的,从来不复制粘贴,所以本宝宝仅仅希望转载的同学可以表明出处和作者!如有不对,欢迎指正,一定要指正啊!!

    展开全文
  • Lucene Solr 811

    万次阅读 多人点赞 2019-10-29 23:11:30
    文章目录solrlucene倒排索引实际举例lucene API 介绍创建索引新建 maven 项目,添加依赖创建测试类,添加以下代码查看索引运行 luke查看文档指定分词器,并测试分词查询测试从索引查询solr 安装把 solr-8.1.1.tgz 传到...

    solr

    Solr是一个高性能,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

    lucene

    Lucene是apache jakarta项目的一个子项目,是一个开放源代码的全文检索引擎开发工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

    倒排索引

    我们一般情况下,先找到文档,再在文档中找出包含的词;

    倒排索引

    倒排索引则是这个过程反过来,用词,来找出它出现的文档.

    倒排索引

    实际举例

    文档编号 文档内容
    1 全文检索引擎工具包
    2 全文检索引擎的架构
    3 查询引擎和索引引擎

    分词结果

    文档编号 分词结果集
    1 {全文,检索,引擎,工具,包}
    2 {全文,检索,引擎,的,架构}
    3 {查询,引擎,和,索引,引擎}

    倒排索引

    编号 单词 文档编号列表
    1 全文 1,2
    2 检索 1,2
    3 引擎 1,2,3
    4 工具 1
    5 1
    6 架构 2
    7 查询 3
    8 索引 3

    lucene API 介绍

    创建索引

    新建 maven 项目,添加依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>cn.tedu</groupId>
    	<artifactId>lucene-demo</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>luceme-demo</name>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.apache.lucene</groupId>
    			<artifactId>lucene-core</artifactId>
    			<version>8.1.1</version>
    		</dependency>
    
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>4.12</version>
    		</dependency>
    
    		<dependency>
    			<groupId>org.apache.lucene</groupId>
    			<artifactId>lucene-analyzers-smartcn</artifactId>
    			<version>8.1.1</version>
    		</dependency>
    
    	</dependencies>
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.apache.maven.plugins</groupId>
    				<artifactId>maven-compiler-plugin</artifactId>
    				<version>3.8.0</version>
    				<configuration>
    					<source>1.8</source>
    					<target>1.8</target>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    </project>
    

    创建测试类,添加以下代码

    package test;
    
    import java.io.File;
    
    import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field.Store;
    import org.apache.lucene.document.LongPoint;
    import org.apache.lucene.document.StoredField;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.Test;
    
    public class Test1 {
    	String[] a = {
    			"3, 华为 - 华为电脑, 爆款",
    			"4, 华为手机, 旗舰",
    			"5, 联想 - Thinkpad, 商务本",
    			"6, 联想手机, 自拍神器"
    	};
    	
    	@Test
    	public void test1() throws Exception {
    		//存储索引文件的路径
    		File path = new File("d:/abc/");
    		FSDirectory d = FSDirectory.open(path.toPath());
    		//lucene提供的中文分词器
    		SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();
    		//通过配置对象来指定分词器
    		IndexWriterConfig cfg = new IndexWriterConfig(analyzer);
    		//索引输出工具
    		IndexWriter writer = new IndexWriter(d, cfg);
    		
    		for (int i = 0; i < a.length; i++) {
    			String[] strs = a[i].split(",");
    			
    			//创建文档,文档中包含的是要索引的字段
    			Document doc = new Document();
    			doc.add(new LongPoint("id", Long.parseLong(strs[0])));
    			doc.add(new StoredField("id", Long.parseLong(strs[0])));
    			doc.add(new TextField("title", strs[1], Store.YES));
    			doc.add(new TextField("sellPoint", strs[2], Store.YES));
    			
    			//将文档写入磁盘索引文件
    			writer.addDocument(doc);
    		}
    		writer.close();
    		
    	}
    	
    }
    

    查看索引

    运行 luke

    运行lucene 8.1.1中的luke应用程序,指定索引的存放目录

    luke

    查看文档

    luke

    指定分词器,并测试分词

    luke

    查询测试

    luke

    • id的查询

    luke

    从索引查询

    在测试类中添加 test2() 测试方法

    package test;
    
    import java.io.File;
    
    import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field.Store;
    import org.apache.lucene.document.LongPoint;
    import org.apache.lucene.document.StoredField;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.ScoreDoc;
    import org.apache.lucene.search.TermQuery;
    import org.apache.lucene.search.TopDocs;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.Test;
    
    public class Test1 {
    	String[] a = {
    			"3, 华为 - 华为电脑, 爆款",
    			"4, 华为手机, 旗舰",
    			"5, 联想 - Thinkpad, 商务本",
    			"6, 联想手机, 自拍神器"
    	};
    	
    	@Test
    	public void test1() throws Exception {
    		//存储索引文件的路径
    		File path = new File("d:/abc/");
    		FSDirectory d = FSDirectory.open(path.toPath());
    		//lucene提供的中文分词器
    		SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();
    		//通过配置对象来指定分词器
    		IndexWriterConfig cfg = new IndexWriterConfig(analyzer);
    		//索引输出工具
    		IndexWriter writer = new IndexWriter(d, cfg);
    		
    		for (int i = 0; i < a.length; i++) {
    			String[] strs = a[i].split(",");
    			
    			//创建文档,文档中包含的是要索引的字段
    			Document doc = new Document();
    			doc.add(new LongPoint("id", Long.parseLong(strs[0])));
    			doc.add(new StoredField("id", Long.parseLong(strs[0])));
    			doc.add(new TextField("title", strs[1], Store.YES));
    			doc.add(new TextField("sellPoint", strs[2], Store.YES));
    			
    			//将文档写入磁盘索引文件
    			writer.addDocument(doc);
    		}
    		writer.close();
    		
    	}
    	
    	@Test
    	public void test2() throws Exception {
    		//索引数据的保存目录
    		File path = new File("d:/abc");
    		FSDirectory d = FSDirectory.open(path.toPath());
    		//创建搜索工具对象
    		DirectoryReader reader = DirectoryReader.open(d);
    		IndexSearcher searcher = new IndexSearcher(reader);
    		
    		//关键词搜索器,我们搜索 "title:华为"
    		TermQuery q = new TermQuery(new Term("title", "华为"));
    		//执行查询,并返回前20条数据
    		TopDocs docs = searcher.search(q, 20);
    
    		//遍历查询到的结果文档并显示
    		for (ScoreDoc scoreDoc : docs.scoreDocs) {
    			Document doc = searcher.doc(scoreDoc.doc);
    			System.out.println(doc.get("id"));
    			System.out.println(doc.get("title"));
    			System.out.println(doc.get("sellPoint"));
    			System.out.println("--------------");
    		}
    	}
    	
    }
    
    

    solr 安装

    下面我们来安装 solr 服务器

    把 solr-8.1.1.tgz 传到服务器

    先切换到 /usr/local 目录

    cd /usr/local
    

    把文件传到 /usr/local 目录下

    解压 solr

    cd /usr/local
    
    # 上传 solr-8.1.1.tgz 到 /usr/local 目录
    # 并解压缩
    tar -xzf solr-8.1.1.tgz
    

    启动 solr

    cd /usr/local/solr-8.1.1
    
    # 不建议使用管理员启动 solr,加 -force 强制启动
    bin/solr start -force
    
    # 开放 8983 端口
    firewall-cmd --zone=public --add-port=8983/tcp --permanent
    firewall-cmd --reload
    

    浏览器访问 solr 控制台

    http://192.168.64.170:8983

    • 注意修改地址

    solr

    创建 core

    数据库中 pd_item 表中的商品数据, 在 solr 中保存索引数据, 一类数据, 在 solr 中创建一个 core 保存索引数据

    创建一个名为 pd 的 core, 首先要准备以下目录结构:

    # solr目录/server/solr/
    #                    pd/
    #                     conf/
    #                     data/
    
    
    cd /usr/local/solr-8.1.1
    
    mkdir server/solr/pd
    mkdir server/solr/pd/conf
    mkdir server/solr/pd/data
    

    conf 目录是 core 的配置目录, 存储一组配置文件, 我们以默认配置为基础, 后续逐步修改

    复制默认配置

    cd /usr/local/solr-8.1.1
    
    cp -r server/solr/configsets/_default/conf server/solr/pd
    

    创建名为 pd 的 core

    core

    中文分词测试

    分词

    填入以下文本, 观察分词结果:

    Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
    

    中文分词工具 - ik-analyzer

    https://github.com/magese/ik-analyzer-solr

    分词

    • 下载 ik-analyzer 分词 jar 文件,传到 solr目录/server/solr-webapp/webapp/WEB-INF/lib

      • 为了后续操作方便,我们把后面用到的jar文件一同传到服务器,包括四个文件:
        • ik-analyzer-8.1.0.jar
        • mysql-connector-java-5.1.46.jar
        • solr-dataimporthandler-8.1.1.jar
        • solr-dataimporthandler-extras-8.1.1.jar
    • 复制6个文件到 solr目录/server/solr-webapp/webapp/WEB-INF/classes

    # classes目录如果不存在,需要创建该目录
    mkdir /usr/local/solr-8.1.1/server/solr-webapp/webapp/WEB-INF/classes
    
    这6个文件复制到 classes 目录下
    resources/
        IKAnalyzer.cfg.xml
        ext.dic
        stopword.dic
        stopwords.txt
        ik.conf
        dynamicdic.txt
    
    • 配置 managed-schema

    修改 solr目录/server/solr/pd/conf/managed-schema,添加 ik-analyzer 分词器

    <!-- 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 服务
    cd /usr/local/solr-8.1.1
    
    bin/solr restart -force
    

    使用 ik-analyzer 对中文进行分词测试

    填入以下文本, 选择使用 text_ik 分词器, 观察分词结果:

    Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
    

    分词

    设置停止词

    上传停止词配置文件到 solr目录/server/solr-webapp/webapp/WEB-INF/classes

    stopword.dic
    stopwords.txt
    
    • 重启服务,观察分词结果中,停止词被忽略
    bin/solr restart -force
    

    准备 mysql 数据库数据

    • 用 sqlyog 执行 pd.sql
    • 授予 root 用户 跨网络访问权限
      注意: 此处设置的是远程登录的 root 用户,本机登录的 root 用户密码不变
    CREATE USER 'root'@'%' IDENTIFIED BY 'root';
    
    GRANT ALL ON *.* TO 'root'@'%';
    

    随机修改30%的商品,让商品下架,以便后面做查询测试

    UPDATE pd_item SET STATUS=0 WHERE RAND()<0.3
    

    从 mysql 导入商品数据

    设置字段

    • title text_ik
    • sellPoint text_ik
    • price plong
    • barcode string
    • image string
    • cid plong
    • status pint
    • created pdate
    • updated pdate

    字段设置

    Copy Field 副本字段

    查询时需要按字段查询,例如 title:电脑, 可以将多个字段的值合并到一个字段进行查询,默认查询字段 _text_

    titlesellPoint 复制到 _text_ 字段

    副本字段

    Data Import Handler 配置

    • 添加 jar 文件

    Data Import Handler 的 jar 文件存放在 solr目录/dist 目录下

    solr-dataimporthandler-8.1.1.jar
    solr-dataimporthandler-extras-8.1.1.jar
    

    复制这两个文件和 mysql 的 jar 文件solr目录/server/solr-webapp/webapp/WEB-INF/lib

    • dih-config.xml
      修改 mysql 的 ip 地址,传到
      solr目录/server/solr/pd/conf

    • solrconfig.xml 中添加 DIH 配置

    <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
        <lst name="defaults">  
        	<str name="config">dih-config.xml</str>  
        </lst>  
    </requestHandler>
    
    • 重启 solr
    cd /usr/local/solr-8.1.1
    
    bin/solr restart -force
    

    导入数据

    重启 solr 后导入数据,确认导入的文档数量为 3160

    数据导入

    查询测试

    在复制字段 _text_ 中查找 电脑

    查询

    在标题中查找 电脑

    查询

    用双引号查找完整词 "笔记本"

    查询

    搜索 +lenovo +电脑

    查询

    搜索 +lenovo -电脑

    查询

    统计 cid

    查询

    查询

    查询

    查询

    价格范围

    Raw Query Parameters 输入框中填入以下内容:

    facet.range=price&facet.range.start=0&facet.range.end=10000&facet.range.gap=2000

    查询

    查询

    多字段统计

    Raw Query Parameters 输入框中填入以下内容:

    facet.pivot=cid,status

    查询

    查询

    拼多商城实现商品的全文检索

    修改 hosts 文件, 添加 www.pd.com 映射

    127.0.0.1      www.pd.com
    

    eclipse 导入 pd-web 项目

    导入项目

    导入项目

    修改数据库连接配置

    application.yml 配置文件中,修改连接配置

    spring:
        datasource:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.jdbc.Driver
            url: jdbc:mysql://127.0.0.1:3306/pd_store?useUnicode=true&characterEncoding=UTF-8
            username: root
            password: root
    

    启动项目, 访问 www.pd.com

    拼多

    商品检索调用分析

    调用

    pom.xml 添加 solr 和 lombok 依赖

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-data-solr</artifactId>
    </dependency>
    
    <dependency>
    	<groupId>org.projectlombok</groupId>
    	<artifactId>lombok</artifactId>
    </dependency>
    

    application.yml 添加 solr 连接信息

    spring:
      data:
        solr:   #注意修改ip地址
          host: http://192.168.64.170:8983/solr/pd
    

    Item 实体类

    package com.pd.pojo;
    
    import java.io.Serializable;
    
    import org.apache.solr.client.solrj.beans.Field;
    
    import lombok.Data;
    
    @Data
    public class Item implements Serializable {
    		private static final long serialVersionUID = 1L;
    		
    		@Field("id")
    		private String id;
    		@Field("title")
    		private String title;
    		@Field("sellPoint")
    		private String sellPoint;
    		@Field("price")
    		private Long price;
    		@Field("image")
    		private String image;
    
    }
    

    SearchService 业务接口

    package com.pd.service;
    
    import java.util.List;
    
    import com.pd.pojo.Item;
    
    public interface SearchService {
    	List<Item> findItemByKey(String key) throws Exception;
    }
    

    SearchServiceImpl 业务实现类

    package com.pd.service.impl;
    
    import java.util.List;
    
    import org.apache.solr.client.solrj.SolrClient;
    import org.apache.solr.client.solrj.SolrQuery;
    import org.apache.solr.client.solrj.response.QueryResponse;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.stereotype.Service;
    
    import com.pd.pojo.Item;
    import com.pd.service.SearchService;
    
    @Service
    public class SearchServiceImpl implements SearchService {
    	
    	/*
    	 * SolrClient实例是在 SolrAutoConfiguration 类中创建的
    	 * 
    	 * SolrAutoConfiguration添加了@Configuration注解,
    	 * 是spring boot自动配置类,其中的solrClient()方法中创建了SolrClient实例
    	 */
    	@Autowired
    	private SolrClient solrClient;
    
    	@Override
    	public List<Item> findItemByKey(String key) throws Exception {
    		//封装查询的关键词
    		//也可以封装其他的查询参数,比如指定字段,facet设置等
    		SolrQuery query = new SolrQuery(key);
    		//查询前多少条数据
    		query.setStart(0);
    		query.setRows(20);
    		
    		//执行查询并得到查询结果
    		QueryResponse qr = solrClient.query(query);
    		//把查询结果转成一组商品实例
    		List<Item> beans = qr.getBeans(Item.class);
    		return beans;
    	}
    
    }
    

    SearchController 控制器

    package com.pd.controller;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    
    import com.pd.pojo.Item;
    import com.pd.service.SearchService;
    
    @Controller
    public class SearchController {
    	@Autowired
    	private SearchService searchService;
    	
    	@GetMapping("/search/toSearch.html")
    	public String search(String key, Model model) throws Exception {
    		List<Item> itemList = searchService.findItemByKey(key);
    		model.addAttribute("list", itemList);
    		return "/search.jsp";
    	}
    }
    
    展开全文
  • solr笔记

    万次阅读 2020-09-06 00:16:13
    【1】安装Solr7.0.1 【2】配置中文分词器 【3】从数据库导入 【4】solrCloud搭建 【5】基于tomcat的安全验证 【6】Solr的检索运算符 【7】查询 【8】fl参数详解 【9】solr函数 【10】设置solr/home的三种方式 【1】...

    【1】安装Solr7.0.1
    【2】配置中文分词器
    【3】从数据库导入
    【4】solrCloud搭建
    【5】基于tomcat的安全验证
    【6】Solr的检索运算符
    【7】查询
    【8】fl参数详解
    【9】solr函数
    【10】设置solr/home的三种方式


    【1】安装Solr7.0.1(解压后可用内嵌jetty直接运行,或者部署在tomcat中。)windows、linux均适用。

    1.部署前的准备,安装jdk1.8及其以上版本,安装tomcat8及其以上版本。
    2.拷贝源目录下server\solr-webapp\的webapp文件夹至tomcat的webapps下,并重命名为solr。
    3.拷贝源目录下server\lib\下的以metrics开头的jar包和ext文件夹中所有jar包至\webapps\solr\WEB-INF\lib\下。
    4.在webapps\solr\WEB-INF\下创建文件夹classes,拷贝源目录下\server\resources\log4j.properties至classes下,并修改日志的保存路径。
    5.在任意地方创建solrhome文件夹,用于存放 solr的功能模块需要的库、solr jar文件、以及 solr的主目录(home)。
    6.拷贝源目录下dist、contrib 两个文件夹至solrhome文件夹下并在其下创建home文件夹。
    7.拷贝源目录下\server\solr\下的所有文件至solrhome\home\文件夹下。
    8.在solrhome\home\文件夹下创建核心文件夹mycore(名称随意)。
    9.拷贝源目录下example\example-DIH\solr\solr\下的所有文件至mycore下。
    10.修改core.properties,可以设置 新的核心名称,如:name=myCore1。不设置默认显示 文件夹名称。
    11.修改mycore\conf\solrconfig.xml文件,(../../../..改为../..)。
    12.关联 solr web应用和 home目录。(修改webapps/solr/WEB-INF/web.xml文件,并注释权限部分。)
    

    【2】配置中文分词器

    1.拷贝源目录下contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-6.5.1.jar至webapps/solr/WEB-INF/lib/ 下。
    2.修改mycore\conf\managed-schema文件,在末尾添加:
    	<!--solr cnAnalyzer-->
    	<fieldType name="solr_cnAnalyzer" class="solr.TextField" positionIncrementGap="100">
    		<analyzer type="index">
    			<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
    		</analyzer>
    		<analyzer type="query">
    			<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
    		</analyzer>
    	</fieldType>
    3。重启solr。
    --------------------------
    配置IK分词器:
    拷贝解压包中 IKAnalyzer2012FF_u1-6.51.jar 至webapps/solr/WEB-INF/lib/ 下;
    拷贝解压包中 IKAnalyzer.cfg.xml ext.dic stopword.dic 至webapps/solr/WEB-INF/classes 下;
    修改 managed-schema文件;
    	<!-- IKAnalyzer -->
    	<fieldType name="IK_cnAnalyzer" class="solr.TextField" positionIncrementGap="100">
         <analyzer type="index">
          <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
        </analyzer>
         <analyzer type="query">
             <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
          </analyzer>
    	</fieldType>
     
    	<!-- IKAnalyzer Field-->
    	<field name="IK_content" type="IK_cnAnalyzer" indexed="true" stored="true"/>
    
    

    【3】从数据库导入

    1.修改mycore\conf\solrconfig.xml文件。(注意dataimport部分,指向的文件;以及solr-dataimporthandler-.*\.jar是否存在)。
    2.配置上面所指定的文件。
    <?xml version="1.0" encoding="UTF-8"?>
    <dataConfig>
    	<dataSource type="JdbcDataSource" 
    			name="ds-1" 
    			driver="com.mysql.jdbc.Driver"
    			url="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=utf-8" 
    			user="root" 
    			password="123456" />
    	<dataSource type="JdbcDataSource" 
    		name="ds-2" 
    		driver="oracle.jdbc.driver.OracleDriver"
    		url="jdbc:oracle:thin:@192.168.5.39:1521:lnora" 
    		user="paas" 
    		password="123456" />
    			
    	<document>
    		<entity name="table1" dataSource="ds-1" query="select id,name from table1">
    			<field column="id" name="id"/>
    			<field column="name" name="IK_content"/>
    		</entity>
    		<entity name="cw_sfmxqr" dataSource="ds-2" query="select jlid,brxm,flm,mc from cw_sfmxqr">
    			<field column="JLID" name="id"/>
    			<field column="MC" name="IK_content"/>
    			<field column="BRXM" name="brxm_s"/>
    			<field column="FLM" name="flm_s"/>
    		</entity>
    	</document>
    </dataConfig>
    3.添加数据库驱动,并重新启动。
    

    【4】solrCloud搭建

    1.搭建zookeeper集群。
    2.搭建单个tomcat+solr。
    	1>搭建方法同上
    	2>建议修改/bin/startup.bat,加入:set "CATALINA_HOME=E:\solrCloud\Tomcat8_1" 
    3.搭建tomcat+solr+zookeeper。
    	1>搭建多份tomcat+solr,注意修改端口等信息(/home/solr.xml),并将tomcat加入zookeeper(/bin/catalina.bat)。
    		set "JAVA_OPTS=%JAVA_OPTS%  -DzkHost=127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"
    	2>新建统一启动脚本并测试启动(此时无需创建实例)。
    		call Tomcat8_1\bin\startup.bat 
    		call Tomcat8_2\bin\startup.bat 
    		call Tomcat8_3\bin\startup.bat 
    	3>上传配置到zookeeper。
    		zkcli.bat -zkhost 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183 -cmd upconfig -confdir E:/solrCloud/cloud_conf/conf -confname myconf
    	4>实例下的配置信息
    		numShards=1
    		collection.configName=myconf
    		name=mycore
    		replicaType=NRT
    		shard=shard1
    		collection=collection1
    		coreNodeName=core_node2
    

    【5】基于tomcat的安全验证

    #在web.xml下配置(在solrj中适合solrCloud):
    <security-constraint>
        <web-resource-collection>
             <!--  <http-method>GET</http-method>-->
            <web-resource-name>tomcat protect page</web-resource-name>
            <!-- /solr目录下的所有资源是受保护的 -->
            <url-pattern>/</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <!-- 这里的member要与tomcat-user.xml中配置的role一致 -->
            <role-name>member</role-name> 
        </auth-constraint>
    </security-constraint>
    <login-config>
        <!-- 验证方式,可选的值为: "BASIC", "DIGEST", "FORM", "CLIENT-CERT" -->
        <auth-method>BASIC</auth-method>
    	<realm-name>solr</realm-name>
    </login-config>
    <security-role>
        <role-name>member</role-name>
    </security-role>
    

    【6】Solr的检索运算符

    1. “:” 指定字段查指定值,如返回所有值*:* 
    2. “?” 表示单个任意字符的通配 
    3. “*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号) 
    4. “~” 表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。 
    5. 邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10 
    6. “^” 控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache 
    7. 布尔操作符AND、|| 
    8. 布尔操作符OR、&& 
    9. 布尔操作符NOT、!、- (排除操作符不能单独与项使用构成查询) 
    10. “+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在 
    11. ( ) 用于构成子查询 
    12. [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710] 
    13. {} 不包含范围检索,如检索某时间段记录,不包含头尾 
    date:{200707 TO 200710} 
    14. \ 转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : \
    

    【7】查询

    一.基本查询
    q – 查询字符串,必须的。
    fl – 指定返回那些字段内容,用逗号或空格分隔多个。
    start – 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。
    rows – 指定返回结果最多有多少条记录,配合start来实现分页。
    sort – 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。
    wt – (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
    fq – (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。
    q.op – 覆盖schema.xml的defaultOperator(有空格时用”AND”还是用”OR”操作逻辑),一般默认指定
    df – 默认的查询字段,一般默认指定
    qt – (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。
    - 排除在要排除的词前加上 “-” (不包含”号) 号。
    indent – 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。
    version – 查询语法的版本,建议不使用它,由服务器指定默认值。
    
    二.高亮
    hl-highlight,h1=true,表示采用高亮。可以用h1.fl=field1,field2 来设定高亮显示的字段。
    hl.fl: 用空格或逗号隔开的字段列表。要启用某个字段的highlight功能,就得保证该字段在schema中是stored。如果该参数未被给出,那么就会高 亮默认字段 standard handler会用df参数,dismax字段用qf参数。你可以使用星号去方便的高亮所有字段。如果你使用了通配符,那么要考虑启用 hl.requiredFieldMatch选项。
    hl.requireFieldMatch:
    如果置为true,除非该字段的查询结果不为空才会被高亮。它的默认值是false,意味 着它可能匹配某个字段却高亮一个不同的字段。如果hl.fl使用了通配符,那么就要启用该参数。尽管如此,如果你的查询是all字段(可能是使用 copy-field 指令),那么还是把它设为false,这样搜索结果能表明哪个字段的查询文本未被找到
    hl.usePhraseHighlighter:
    如果一个查询中含有短语(引号框起来的)那么会保证一定要完全匹配短语的才会被高亮。
    hl.highlightMultiTerm
    如果使用通配符和模糊搜索,那么会确保与通配符匹配的term会高亮。默认为false,同时hl.usePhraseHighlighter要为true。
    hl.snippets:
    这是highlighted片段的最大数。默认值为1,也几乎不会修改。如果某个特定的字段的该值被置为0(如f.allText.hl.snippets=0),这就表明该字段被禁用高亮了。你可能在hl.fl=*时会这么用。
    hl.fragsize:
    每个snippet返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。大字段时不会这么做。
    hl.mergeContiguous:
    如果被置为true,当snippet重叠时会merge起来。
    hl.maxAnalyzedChars:
    会搜索高亮的最大字符,默认值为51200,如果你想禁用,设为-1
    hl.alternateField:
    如果没有生成snippet(没有terms 匹配),那么使用另一个字段值作为返回。
    hl.maxAlternateFieldLength:
    如果hl.alternateField启用,则有时需要制定alternateField的最大字符长度,默认0是即没有限制。所以合理的值是应该为
    hl.snippets * hl.fragsize这样返回结果的大小就能保持一致。
    hl.formatter:一个提供可替换的formatting算法的扩展点。默认值是simple,这是目前仅有的选项。
    显然这不够用,你可以看看org.apache.solr.highlight.HtmlFormatter.java 和 solrconfig.xml中highlighting元素是如何配置的。
    注意在不论原文中被高亮了什么值的情况下,如预先已存在的em tags,也不会被转义,所以在有时会导致假的高亮。
    hl.fragmenter:
    这个是solr制 定fragment算法的扩展点。gap是默认值。regex是另一种选项,这种选项指明highlight的边界由一个正则表达式确定。这是一种非典型 的高级选项。为了知道默认设置和fragmenters (and formatters)是如何配置的,可以看看solrconfig.xml中的highlight段。
    regex 的fragmenter有如下选项:
    hl.regex.pattern:正则表达式的pattern
    hl.regex.slop:这是hl.fragsize能变化以适应正则表达式的因子。默认值是0.6,意思是如果hl.fragsize=100那么fragment的大小会从40-160.
    三.分组查询:
    1.Field Facet
    facet_queries:代表自定义条件查询facet,类似数据库的count函数
    facet_fields    :代表根据字段分组查询,类似数据库的group by count的组合
    facet_dates :根据日期区间分组查询
    facet_ranges:当然了,日期有区间,数字也有,这个就是根据数字分组查询
    Facet 字段通过在请求中加入 ”facet.field” 参数加以声明 , 如果需要对多个字段进行 Facet查询 , 那么将该参数声明多次 . 比如
    /select?q=联想
    &facet=on
    &facet.field=cpu
    &facet.field=videoCard
    各个 Facet 字段互不影响 , 且可以针对每个 Facet 字段设置查询参数 . 以下介绍的参数既可以应用于所有的 Facet 字段 , 也可以应用于每个单独的 Facet 字段 . 应用于单独的字段时通过
    f.字段名.参数名=参数值
    这种方式调用 . 比如 facet.prefix 参数应用于 cpu 字段 , 可以采用如下形式
    f.cpu.facet.prefix=Intel
    1.1   facet.prefix
    表示 Facet 字段值的前缀 . 比如 ”facet.field=cpu&facet.prefix=Intel”, 那么对 cpu字段进行 Facet 查询 , 返回的 cpu 都是以 ”Intel” 开头的 ,”AMD” 开头的 cpu 型号将不会被统计在内 .
    1.2   facet.sort
    表示 Facet 字段值以哪种顺序返回 . 可接受的值为 true(count)|false(index,lex). true(count) 表示按照 count 值从大到小排列 . false(index,lex) 表示按照字段值的自然顺序 (字母 , 数字的顺序 ) 排列 . 默认情况下为 true(count). 当 facet.limit 值为负数时 ,默认 facet.sort= false(index,lex).
    1.3   facet.limit
    限制 Facet 字段返回的结果条数 . 默认值为 100. 如果此值为负数 , 表示不限制 .
    1.4   facet.offset
    返回结果集的偏移量 , 默认为 0. 它与 facet.limit 配合使用可以达到分页的效果 .
    1.5   facet.mincount
    限制了 Facet 字段值的最小 count, 默认为 0. 合理设置该参数可以将用户的关注点集中在少数比较热门的领域 .
    1.6   facet.missing
    默认为 ””, 如果设置为 true 或者 on, 那么将统计那些该 Facet 字段值为 null 的记录.
    1.7   facet.method
    取值为 enum 或 fc, 默认为 fc. 该字段表示了两种 Facet 的算法 , 与执行效率相关 .
    enum 适用于字段值比较少的情况 , 比如字段类型为布尔型 , 或者字段表示中国的所有省份.Solr 会遍历该字段的所有取值 , 并从 filterCache 里为每个值分配一个 filter( 这里要求 solrconfig.xml 里对 filterCache 的设置足够大 ). 然后计算每个 filter 与主查询的交集 .
    fc( 表示 Field Cache) 适用于字段取值比较多 , 但在每个文档里出现次数比较少的情况 .Solr 会遍历所有的文档 , 在每个文档内搜索 Cache 内的值 , 如果找到就将 Cache 内该值的count 加 1.
    1.8   facet.enum.cache.minDf
    当 facet.method=enum 时 , 此参数其作用 ,minDf 表示 minimum document frequency. 也就是文档内出现某个关键字的最少次数 . 该参数默认值为 0. 设置该参数可以减少 filterCache 的内存消耗 , 但会增加总的查询时间 ( 计算交集的时间增加了 ). 如果设置该值的话 ,官方文档建议优先尝试 25-50 内的值 .
    2. Date Facet
    日期类型的字段在文档中很常见 , 如商品上市时间 , 货物出仓时间 , 书籍上架时间等等 . 某些情况下需要针对这些字段进行 Facet. 不过时间字段的取值有无限性 , 用户往往关心的不是某个时间点而是某个时间段内的查询统计结果 . Solr 为日期字段提供了更为方便的查询统计方式 .当然 , 字段的类型必须是 DateField( 或其子类型 ).
    需要注意的是 , 使用 Date Facet 时 , 字段名 , 起始时间 , 结束时间 , 时间间隔这 4 个参数都必须提供 .
    与 Field Facet 类似 ,Date Facet 也可以对多个字段进行 Facet. 并且针对每个字段都可以单独设置参数 .
    2.1   facet.date
    该参数表示需要进行 Date Facet 的字段名 , 与 facet.field 一样 , 该参数可以被设置多次 , 表示对多个字段进行 Date Facet.
    2.2   facet.date.start
    起始时间 , 时间的一般格式为 ” 1995-12-31T23:59:59Z”, 另外可以使用 ”NOW”,”YEAR”,”MONTH” 等等 , 具体格式可以参考 org.apache.solr.schema. DateField 的 java doc.
    2.3   facet.date.end
    结束时间 .
    2.4   facet.date.gap
    时间间隔 . 如果 start 为 2009-1-1,end 为 2010-1-1.gap 设置为 ”+1MONTH” 表示间隔1 个月 , 那么将会把这段时间划分为 12 个间隔段 . 注意 ”+” 因为是特殊字符所以应该用 ”%2B” 代替 .
    2.5   facet.date.hardend
    取值可以为 true|false, 默认为 false. 它表示 gap 迭代到 end 处采用何种处理 . 举例说明 start 为 2009-1-1,end 为 2009-12-25,gap 为 ”+1MONTH”,hardend 为 false 的话最后一个时间段为 2009-12-1 至 2010-1-1;hardend 为 true 的话最后一个时间段为 2009-12-1 至 2009-12-25.
    2.6   facet.date.other
    取值范围为 before|after|between|none|all, 默认为 none.
    before 会对 start 之前的值做统计 .
    after 会对 end 之后的值做统计 .
    between 会对 start 至 end 之间所有值做统计 . 如果 hardend 为 true 的话 , 那么该值就是各个时间段统计值的和 .
    none 表示该项禁用 .
    all 表示 before,after,all 都会统计 .
    举例 :
    &facet=on
    &facet.date=date
    &facet.date.start=2009-1-1T0:0:0Z
    &facet.date.end=2010-1-1T0:0:0Z
    &facet.date.gap=%2B1MONTH
    &facet.date.other=all
    返回结果 :
    <lst name="facet_counts">
             <lst name="facet_queries"/>
             <lst name="facet_fields"/>
             <lst name="facet_dates">
    <int name="2009-01-01T00:00:00Z">5</int>
    <int name="2009-11-01T00:00:00Z">1</int>
    <int name="2009-12-01T00:00:00Z">5</int>
    <str name="gap">+1MONTH</str>
    <date name="end">2010-01-01T00:00:00Z</date>
    <int name="before">180</int>
    <int name="after">5</int>
    <int name="between">54</int>
    </lst>
    </lst>
    3.       Facet Query
    Facet Query 利用类似于 filter query 的语法提供了更为灵活的 Facet. 通过 facet.query 参数 , 可以对任意字段进行筛选 .
    例 1:
    &facet=on
    &facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
    &facet.query=date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]
    返回结果 :
    <lst name="facet_counts">
             <lst name="facet_queries">
                       <int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>
    <int name="date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]">3</int>
    </lst>
             <lst name="facet_fields"/>
             <lst name="facet_dates"/>
    </lst>
    例 2:
    &facet=on
    &facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
    &facet.query=price:[* TO 5000]
    返回结果 :
    <lst name="facet_counts">
             <lst name="facet_queries">
                       <int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>
    <int name="price:[* TO 5000]">116</int>
    </lst>
             <lst name="facet_fields"/>
             <lst name="facet_dates"/>
    </lst>
    例 3:
    &facet=on
    &facet.query=cpu:[A TO G]
    返回结果 :
    <lst name="facet_counts">
             <lst name="facet_queries">
                       <int name="cpu:[A TO G]">11</int>
    </lst>
             <lst name="facet_fields"/>
             <lst name="facet_dates"/>
    </lst>
    4.       key 操作符
    可以用 key 操作符为 Facet 字段取一个别名 .
    例 :
    &facet=on
    &facet.field={!key=中央处理器}cpu
    &facet.field={!key=显卡}videoCard
    返回结果 :
    <lst name="facet_counts">
             <lst name="facet_queries"/>
             <lst name="facet_fields">
                       <lst name="中央处理器">
                                <int name="Intel 酷睿2双核 T6600">48</int>
                                <int name="Intel 奔腾双核 T4300">28</int>
     
                       </lst>
                       <lst name="显卡">
                                <int name="ATI Mobility Radeon HD 4">63</int>
                                <int name="NVIDIA GeForce G 105M">24</int>
    <int name="NVIDIA GeForce GT 240M">21</int>
    <int name="NVIDIA GeForce G 103M">8</int>
    <int name="NVIDIA GeForce GT 220M">8</int>
    <int name="NVIDIA GeForce 9400M G">7</int>
    <int name="NVIDIA GeForce G 210M">6</int>
    </lst>
             </lst>
             <lst name="facet_dates"/>
    </lst>
    5.       tag 操作符和 ex 操作符
    当查询使用 filter query 的时候 , 如果 filter query 的字段正好是 Facet 字段 , 那么查询结果往往被限制在某一个值内 .
    例 :
    &fq=screenSize:14
    &facet=on
    &facet.field=screenSize
    返回结果 :
    <lst name="facet_counts">
             <lst name="facet_queries"/>
             <lst name="facet_fields">
                       <lst name=" screenSize">
                                <int name="14.0">107</int>
    <int name="10.2">0</int>
    <int name="11.1">0</int>
    </lst>
             </lst>
             <lst name="facet_dates"/>
    </lst>
    可以看到 , 屏幕尺寸 (screenSize) 为 14 寸的产品共有 107 件 , 其它尺寸的产品的数目都是0, 这是因为在 filter 里已经限制了 screenSize:14. 这样 , 查询结果中 , 除了 screenSize=14 的这一项之外 , 其它项目没有实际的意义 .
    有些时候 , 用户希望把结果限制在某一范围内 , 又希望查看该范围外的概况 . 比如上述情况 ,既要把查询结果限制在 14 寸屏的笔记本 , 又想查看一下其它屏幕尺寸的笔记本有多少产品 . 这个时候需要用到 tag 和 ex 操作符 .
    tag 就是把一个 filter 标记起来 ,ex(exclude) 是在 Facet 的时候把标记过的 filter 排除在外 .
    例 :
    &fq={!tag=aa}screenSize:14
    &facet=on
    &facet.field={!ex=aa}screenSize
    返回结果 :
    <lst name="facet_counts">
             <lst name="facet_queries"/>
             <lst name="facet_fields">
                       <lst name=" screenSize">
                                <int name="14.0">107</int>
    <int name="14.1">40</int>
    <int name="13.3">34</int>
    </lst>
             </lst>
             <lst name="facet_dates"/>
    </lst>
    

    【8】fl参数详解

    #参数fl限定了查询结果中包含哪些字段。这些指定的字段必须满足 stored=”true” 或者 docValues=”true”。
    #如果返回多个字段,可以使用逗号(,)或者空格 将多个字段隔开。
    1)函数处理 fl=sum(x, y),id,a,b,c,score
    2)字段改名 displayName:filename
    

    【9】solr函数

    1)使用Function Query
    	#直接向QParser指定函数参数,如func或frange: 
    	q={!func}div(popularity,price)&fq={!frange l=1000}customer_ratings
    	#在排序时使用: 
    	sort=div(popularity,price) desc, score desc
    	#在查询结果中预处理一些输出字段 
    	&fl=sum(x, y),id,a,b,c,score
    	#指定函数的一个参数:在EDisMax中指定boost参数,在DisMax中指定bf参数。 
    	q=dismax&bf="ord(popularity)^0.5 recip(rord(price),1,1000,1000)^0.3"
    	#在Lucene的QParser中使用_val_关键字指定函数: 
    	q=_val_:mynumericfield _val_:"recip(rord(myfield),1,2,3)"
    2)Solr中的可用函数
    	concat(a,b) 连接a,b
    	abs(x)	返回绝对值	abs(-5)
    	“constant”	指定一个浮点数	1.5
    	def(“field”,value)	默认值,当指定字段不存在时,返回默认值	def(rating,5)
    	div(x,y)	除法,x除以y	div(1,5)
    	dist	计算两点之间的距离	dist(2, x, y, 0, 0)
    	docfreq(field,val)	返回某值在某字段出现的次数	docfreq(title,’solr’)
    	field(“field”)	返回该field的索引数量	field(“title”)
    	hsin	曲面圆弧上两点之间的距离	hsin(2, true, x, y, 0, 0)
    	idf	Inverse document frequency倒排文档频率	idf(“field”,’solr’)
    	if	if(test,value1,value2)	if(termfreq (title,’solr’), popularity,42)
    	linear(x,m,c)	就是m*x+c,等同于sum(product(m,x),c)	linear(1,2,4)=1x2+4=6
    	log(x)	以10为底,x的对数	log(sum(x,100))
    	map(x,min,max,target)	映射一个在最小值min与最大值max之间,又包含target的值	map(x,0,0,1)
    	max(x,y,…)	返回最大值	max(2,3,0)
    	maxdoc	返回索引的个数,查看有多少文档,包括被标记为删除状态的文档	maxdoc()
    	min(x,y,…)	返回最小值	min(2,3,0)
    	ms	返回两个参数间毫秒级的差别	ms(datefield1, 2000-01-01T00:00:00Z)
    	norm(field)	返回该字段索引值的范数	norm(title)
    	numdocs	返回索引的个数,查看有多少文档,不包括被标记为删除状态的文档	numdocs()
    	ord	根据顺序索引返回结果	ord(title)
    	pow(x,y)	返回x的y次方	pow(x,log(y))
    	product(x,y)	返回多个值的乘机	product(x,2)
    	query	返回给定的子查询的得分,或者文档不匹配的默认值值	query(subquery, default)
    	recip(x,m,a,b)	相当于a/(m*x+b),a,m,b是常量,x是变量	recip(myfield,m,a,b)
    	rord	按ord的结果反序返回	rord(title)
    	scale	返回一个在最大值和最小值之间的值	scale(x,1,2)
    	sqedist	平方欧氏距离计算	sqedist(x_td, y_td, 0, 0)
    	sqrt	返回指定值的平方根	sqrt(x)sqrt(100)
    	strdist	计算两个字符串之间的距离	strdist(“SOLR”,id,edit)
    	sub	返回x-y	sub(myfield,myfield2)
    	sum(x,y)	返回指定值的和	sum(x,y,…)
    	sumtotaltermfreq	返回所有totaltermfreq的和	
    	termfreq	词出现的次数	termfreq(title,’solr’)
    	tf	词频	tf(text,’solr’)
    	top	功能类似于ord	
    	totaltermfreq	返回这个词在该字段出现的次数	ttf(title,’memory’)
    	and	返回true值当且仅当它的所有操作为true	and(not (exists (popularity)), exists (price))
    	or	返回true值当有一个操作为true	or(value1,value2)
    	xor	返回false值如果所有操作都为真	xor(field1,field2)
    	not	排除操作	not(exists(title))
    	exists	如果字段存在返回真	exists(title)
    	gt, gte, lt, lte, eq	比较函数	2 gt 1
    

    【10】设置solr/home的三种方式

    1> 在web.xml中设置
        <env-entry>
           <env-entry-name>solr/home</env-entry-name>
           <env-entry-value>C:/example2/solr(path_to_solr_home_solr)</env-entry-value>
           <env-entry-type>java.lang.String</env-entry-type>
        </env-entry>
    
    2> 通过tomcat的JNDI方式设置变量
    #在你安装tomcat的根目录下,找到或者新建路径:conf\Catalina\localhost.根据你部署的项目名称,新建一个XML文件,如果包名叫solr,就叫solr.xml。内容为:
    <Context docBase="E:/apache-tomcat6_1/webapps/solr(the_path_to solr.war)" debug="0" crossContext="true" >
       <Environment name="solr/home" type="java.lang.String" value="C:/example2/solr(the_path_to_solr_home)" override="true" />
    </Context>
    
    3> tomcat启动的JAVA_OPTS参数设置方式
    #在你安装tomcat的根目录下,找到bin\catalina.bat 在JAVA_OPTS选项中添加,
    set JAVA_OPTS -Dsolr.solr.home=C:/example2/solr
    
    
    展开全文
  • solr7.4教程 使用solr的完整流程

    万次阅读 多人点赞 2018-07-15 12:36:22
    由于最近公司业务可能需要用到solr所以花了几天时间研究了一下,发现solr在网上的教程没有太好的入门文章,要么文章所写的solr版本太老,要么就是介绍的内容不够完整。所有我打算写一篇有完整使用流程的solr教程希望...
  • solr 基本用法

    千次阅读 2016-12-16 15:54:48
    solr
  • solr
  • solr install

    2017-07-24 12:20:44
    一、solr简介:  Solr是一个独立的企业及搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求...
  • Apache Solr

    2019-01-16 10:18:45
    01 Apache Solr概述 02 Apache Solr搜索引擎基础知识 03 Apache Solr 环境设置 04 Apache Solr On Hadoop 05 Apache Solr架构 06 Apache Solr术语 07 Apache Solr基本命令 08 Apache Solr Core 09 Apache Solr索引...
  • 什么是solrsolrsolrCore

    千次阅读 2016-09-25 14:18:39
    1.什么是solr的core? 2. 如何在线给solr增加core? 3.什么是solr?由于搜索引擎功能在门户社区中对提高用户体验有着 重在门户社区中涉及大量需要搜索引擎的功能需求,目前在实现搜索引擎的方案上有集中方案可供...
  • Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
  • solr安装

    千次阅读 2016-05-17 16:47:03
    1.1 Solr下载分享牛,分享牛原创,分享牛系列。solr和lucene的版本是同步更新的,最新的版本是5.2.1本课程使用的版本:4.10.3下载地址:http://archive.apache.org/dist/lucene/solr/下载版本:4.10.3Linux下需要...
  • solr
  • 1. Solr安装及配置 1.1. Solr的下载 从Solr官方网站(http://lucene.apache.org/solr/ )下载Solr4.10.3,根据Solr的运行环境,Linux下需要下载lucene-4.10.3.tgz,windows下需要下载lucene-4.10.3.zip。 Solr...
  • solr5.5.5修改solr_home

    2018-08-11 11:50:42
    使用bin目录的solr命令启动,我们发现他的solr_home是{安装路径}/solr/solr-5.5.5/server/solr 修改方式一:(本次启动生效) ./solr start -s {安装路径}/solr/solrhome 修改方式二:(永久生效) 1、 vim ~/....
  • solr优化

    2019-01-28 13:48:54
    solr占用系统内存优化 solr当访问量大时,会因占用内存超过最大设置,而导致内存溢出OOM。可在solr的日志目录下找到类似下面名字的日志文件: 打开文件,文件内容如下: 文件内容的含义就是 solr进程因内存溢出...
  • Springboot整合Solr详细讲解

    万次阅读 2020-07-28 14:33:44
    搭建Solr环境 SpringBoot整合Solr 1、添加整合依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-solr</artifactId> </...
  • solr5和solr4的区别

    千次阅读 2016-11-26 16:44:20
    摘要: 由于公司要升级solr,想知道solr5相对solr4来说有哪些改进,于是按照官网的介绍,总结下来。Solr5新功能 增加易用性 改进了bin/solr,新增bin/post脚本 重构了Config Sets SolrJ支持Collections API 默认...
  • Solr入门

    2018-05-28 21:59:10
    一、solr安装 验证jdk环境 下载solr二进制分发包 二、启动solr 三、了解Solr主目录 四、对示例文档进行索引 本文主要介绍solr的基本用法。首先,我们从Apache官网下载solr的二进制分发包,然后解压缩文件。...
  • Solr之——solr5.2.1环境搭建

    千次阅读 2016-08-01 11:24:13
    1、下载Tomcat与solr-5.2.1并解压,Tomcat解压后的目录为:E:\apache-tomcat-7.0.62,solr解压后的目录为:E:\solr-5.2.1 2、将solr部署到Tomcat中  1)、将E:\solr-5.2.1\example\example-DIH目录下的solr文件夹...
  • Solr 7.3 (一)

    千次阅读 2018-06-18 16:41:08
    Solr
  • 查看solr的管理功能界面需要成功启动solr服务,未安装请参考(Solr 一)搭建单机版solr服务器(centos),(Solr 二)配置solr中文分词器(centos) solr管理功能界面访问地址 http://ip:8080/solr 1. Dashboard 仪表盘,...
  • 在上一篇的博文中我们在Tomcat8\solr_h\solrhome目录下新建了一个solr_core,一个solrhome目录里面包含多个solrcore目录,一个solrcore目录里面了一个solr实例运行时所需要的配置文件和数据文件。每一个solrcore都...
  • Solr工作原理

    万次阅读 2018-07-13 14:56:19
    Solr简介Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML...

空空如也

1 2 3 4 5 ... 20
收藏数 36,146
精华内容 14,458
关键字:

solr