Solr环境搭建(引用)

总结别人博客,留给最好的自己。

想要使用solr那么首先我们得安装它

1:安装 Tomcat,解压缩即可。

2:解压 solr,官网 http://lucene.apache.org/solr/

Solr环境搭建(引用)

3:把 solr 下的dist目录solr-4.10.3.war(我用的是这个版本)部署到 Tomcat\webapps下(去掉版本号)。

Solr环境搭建(引用)

4:解压缩 war 包,可以启动 Tomcat解压,可以用压缩软件解压   --【直接粘贴到Tomcat\webapps下,解压后删除war文件(不删的话,重启tomcat时默认会覆盖你的修改)】

5:把solr下example/lib/ext 目录下的所有的 jar 包,添加到 solr(Tomcat\webapps\solr) 的工程中(\WEB-INF\lib目录下)。

Solr环境搭建(引用)

6:创建一个 solrhome 。solr 下的/example/solr 目录就是一个 solrhome。复制此目录到某个盘改名为solrhome 

Solr环境搭建(引用)

7:关联 solr 及 solrhome。需要修改 solr 工程的 web.xml 文件。

Solr环境搭建(引用)

8:启动 Tomcat,看到下面这个界面说明solr安装成功啦

Solr环境搭建(引用)

http://IP:8080/solr/

 

Solr服务器配置中文分词器

但是由于这个东西是外国人写的,再加上博大精深的中华文化,solr对于中文的分词效果非常糟糕,不能很好的分词,就不能建立一个很好的索引库,也就不能提供好的搜索服务.于是我们中国人基于solr自己写了个分词器,终于能够愉快的使用solr了;

而当我们使用了中文分词器后效果变成这样

下面我们就来说说怎样使用这个中午让你分词器吧(当然有多种啦,目前最受欢迎的就是IK Analyzer 啦)

介绍:

IK Analyzer 是一个开源的,基亍 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。从 3.0 版本开始,IK 发展为面向 Java 的公用分词组件,独立亍 Lucene 项目,同时提供了对 Lucene 的默认优化实现。在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。

 

使用步骤:

1、下载IKAnalyzer,解压后把IKAnalyzer2012FF_u1.jar 添加到 solr 工程的 lib 目录下

Solr环境搭建(引用)

官网:http://code.google.com/p/ik-analyzer/downloads/list,打不开就到网上找一个

2、创建WEB-INF/classes文件夹  把扩展词典、停用词词典、配置文件放到 solr 工程的 WEB-INF/classes 目录下。


ext.dic的内容,比如如下:

高富帅
黑马程序员
二维表
这样的话,碰到这样的词就不会进行拆分了,所以,一些网络新词就可以在这里进行配置。

IKAnalyer.cfg.xml文件 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">ext.dic;</entry> 
    
    <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">stopword.dic;</entry> 
    
</properties>
stopwords.dic内容:




a
an
and
are
as
 
这样的话,对于上面的字就不会进行显示处理了,因为这些都是没有意义的词汇。
 

3、修改 Solrhome 的 schema.xml 文件,配置一个 FieldType,使用 IKAnalyzer

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

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

</fieldType>

重启tomcat,如图提示操作,看到下面的效果说明成功

Solr环境搭建(引用)
————————————————
配置solr服务器导入数据库数据

(1)导包

首先是需要在solr的核心库中添加一些导入数据的包,需要如下:

Solr环境搭建(引用)

注意:因为在collection中,最初是没有lib这个文件目录的,所以需要自己创建一个lib目录,然后把相应的jar包添加进去。

Solr环境搭建(引用)

(2)在collection中的config目录下的solrconfig.xml中添加数据导入处理器

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

3)在collection中的config目录添加一个data-config.xml(这个与上面一步配置的名字要相同)

 <?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
            driver="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/需要导入数据的数据库名"
            user="数据库账号"
            password="数据库密码"/>
<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>

Solr环境搭建(引用)

(4)在collection中config目录下的schema.xml添加如下内容

保留 <field name="_version_" type="long" indexed="true" stored="true"/>和<field name="_root_" type="string" indexed="true" stored="false"/>

<uniqueKey>product_name</uniqueKey> 字段改成自己的,我的数据库唯一值是 product_name。

把 dynamicField 也都删除掉 ,把 <uniqueKey>id</uniqueKey> 删除掉。
   其余的 field 删除掉,并修改成自己的内容,如下:


<!--配置从数据库导入到sorl中的数据的字段内容,所以每次要从数据库导入什么就需要配置什么-->
    <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" />
 

1.重启tomcat 访问 http://localhost:8080/solr 会出现管理界面
2.点击页面左侧的 Core Admin,在右侧 name: 和 instanceDir: 输入 myProject,点击 Add Core,创建成功。
3.下面来导入数据,在左侧 Core Selector,选择myProject, 然后点击下面DataImport,点击右侧Execute,导入完成会提示类似下面的信息
      Last Update: 11:38:41
Indexing completed. Added/Updated: 787 documents. Deleted 0 documents. (Duration: 03s) 
Requests: 1 (0/s), Fetched: 787 (262/s), Skipped: 0, Processed: 787 (262/s)
Started: less than a minute ago

4.进入查询界面,试试看能不能检索出结果,点击页面右下角的 Query,q 输入框*:*不用修改,直接点击 Execute Query,如果没问题的话
    右侧应该会出现检索结果

查询命令的基本使用 

  1.       q 查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*,

  2.   fl 指定返回哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort

  3.   start 返回结果的第几条记录开始,一般分页用,默认0开始

  4.   rows 指定返回结果最多有多少条记录,默认值为 10,配合start实现分页

  5.   sort 排序方式,例如id desc 表示按照 “id” 降序

  6.   wt (writer type)指定输出格式,有 xml, json, php等

  7.   fq (filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id为1 的,并且sort是1到5之间的。

  8.   df 默认的查询字段,一般默认指定。

  9.   qt (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。

  10.   indent 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。

  11.   version 查询语法的版本,建议不使用它,由服务器指定默认值。

检索运算符

  1.        “:” 指定字段查指定值,如返回所有值*:*
  2.   “?” 表示单个任意字符的通配
  3.   “*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)
  4.   “~” 表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
  5.   AND、|| 布尔操作符
  6.   OR、&& 布尔操作符
  7.   NOT、!、-(排除操作符不能单独与项使用构成查询)
  8.   “+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在²
  9.   ( ) 用于构成子查询
  10.   [] 包含范围检索,如检索某时间段记录,包含头尾,date:[201507 TO 201510]
  11.   {} 不包含范围检索,如检索某时间段记录,不包含头尾date:{201507 TO 201510} 

Java中使用SolrJ

1.添加依赖

Solr环境搭建(引用)

2.创建java实体类封装数据,封装了和配置文件中配置的业务字段相对应的字段的一个实体对象

public class Entity{

@Field(value = "id")
private String id;

@Field(value = "name")
private String name;

@Field(value = "description")
private String description;

}

 接下来就是具体操作solr的代码,实际项目中可根据需要对操作solr的增删改查的方法做进一步的封装,新建SolrUtil工具类

  1. public class SolrUtil {
  2. //solr服务器所在的地址,core0为自己创建的文档库目录
  3. private final static String SOLR_URL = "http://192.168.111.130:8080/solr/core0";
  4. /**
  5.  * 获取客户端的连接
  6.  * 
  7.  * @return
  8.  */
  9. public HttpSolrClient createSolrServer() {
  10.     HttpSolrClient solr = null;
  11.     solr = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();
  12.     return solr;
  13. }
  14. /**
  15.  * 往索引库添加文档
  16.  * 
  17.  * @throws SolrServerException
  18.  * @throws IOException
  19.  */
  20. public void addDoc() throws SolrServerException, IOException {
  21.     SolrInputDocument document = new SolrInputDocument();
  22.     document.addField("id", "7");
  23.     document.addField("name", "钢铁侠");
  24.     document.addField("description", "一个逗比的码农");
  25.     HttpSolrClient solr = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000)
  26.             .withSocketTimeout(60000).build();
  27.     solr.add(document);
  28.     solr.commit();
  29.     solr.close();
  30.     System.out.println("添加成功");
  31. }
  32. /**
  33.  * 根据ID从索引库删除文档
  34.  * 
  35.  * @throws SolrServerException
  36.  * @throws IOException
  37.  */
  38. public void deleteDocumentById() throws SolrServerException, IOException {
  39.     HttpSolrClient server = new HttpSolrClient.Builder(SOLR_URL)
  40.                 .withConnectionTimeout(10000)
  41.                 .withSocketTimeout(60000).build();
  42.     server.deleteById("6");
  43.     server.commit();
  44.     server.close();
  45. }
  46. /**
  47.  * 根据设定的查询条件进行文档字段的查询
  48.  * @throws Exception
  49.  */
  50. public void querySolr() throws Exception {
  51.     HttpSolrClient server = new HttpSolrClient.Builder(SOLR_URL)
  52.                 .withConnectionTimeout(10000)
  53.                 .withSocketTimeout(60000).build();
  54.     SolrQuery query = new SolrQuery();
  55.     //下面设置solr查询参数
  56.     //query.set("q", "*:*");// 参数q  查询所有   
  57.     query.set("q", "钢铁侠");//相关查询,比如某条数据某个字段含有周、星、驰三个字  将会查询出来 ,这个作用适用于联想查询
  58.     //参数fq, 给query增加过滤查询条件 
  59.     query.addFacetQuery("id:[0 TO 9]");
  60.     query.addFilterQuery("description:一个逗比的码农"); 
  61.     //参数df,给query设置默认搜索域,从哪个字段上查找
  62.     query.set("df", "name"); 
  63.     //参数sort,设置返回结果的排序规则
  64.     query.setSort("id",SolrQuery.ORDER.desc);
  65.     //设置分页参数
  66.     query.setStart(0);
  67.     query.setRows(10);
  68.     //设置高亮显示以及结果的样式
  69.     query.setHighlight(true);
  70.     query.addHighlightField("name");  
  71.     query.setHighlightSimplePre("<font color='red'>");  
  72.     query.setHighlightSimplePost("</font>"); 
  73.     //执行查询
  74.     QueryResponse response = server.query(query);
  75.     //获取返回结果
  76.     SolrDocumentList resultList = response.getResults();
  77.     for(SolrDocument document: resultList){
  78.         System.out.println("id:"+document.get("id")+"   document:"+document.get("name")+"    description:"+document.get("description"));
  79.     }
  80.     //获取实体对象形式
  81.     List<Person> persons = response.getBeans(Person.class);
  82.     System.out.println(persons.get(0).getName());
  83. }
  84. public static void main(String[] args) throws Exception {
  85.     SolrUtil solr = new SolrUtil();
  86.     //solr.addDoc();
  87.     solr.querySolr();
  88. }
  89. }

引用:

https://blog.****.net/luo609630199/article/details/82494708

https://blog.****.net/Cs_hnu_scw/article/details/79388080