solr实现搜索(搜索引擎)

    1. solr
    1. elastic serch
  • 基于apache luence的开源实现
  • 内置容器:Jetty,
  • 1
    2
    bin          contrib  docs     licenses     LUCENE_CHANGES.txt  README.txt
    CHANGES.txt dist example LICENSE.txt NOTICE.txt server
  • server文件夹

1
2
3

contexts lib README.txt scripts solr-webapp
etc modules resources solr start.jar
  • 可以拿出来的运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method-omission>TRACE</http-method-omission>
</web-resource-collection>
</security-constraint>
  • 访问:

    1
    ./solr start  -force
  • 提示信息

  • 1
    2
    3
    4
    5
    6
    7
    [[email protected] bin]# ./solr start  -force
    Warning: Available entropy is low. As a result, use of the UUIDField, SSL, or any other features that require
    RNG might not work properly. To check for the amount of available entropy, use 'cat /proc/sys/kernel/random/entropy_avail'.

    NOTE: Please install lsof as this script needs it to determine if Solr is listening on port 8983.

    Started Solr server on port 8983 (pid=2409). Happy searching!
1
2
3
4
5
6
7
<requestHandler name="/select" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
  • 上面增加一个导入节点:
1
2
3
4
5
<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的配置文件
1
2
3
4
5
6
7
8
9
10
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.13:3306/mogujie" user="root" password="root" />
<document>
<entity name="product" query="select * from product">
<field column="product_name" name="productName" />
<field column="id" name="id" />
<field column="product_volume" name="productVolume" />
</entity>
</document>
</dataConfig>
  • 在managed-schema配置:
  • 配置分词器插件:
1
2
3
4
<fieldType name="text_ik" class="solr.TextField">   
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
  • 操作步骤:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    1.将压缩包上传到home文件夹下
    2.连接到虚拟机,进入/home路径
    3.解压 tar -zxvf solr-7.2.1.tgz -C /usr/local
    4.进入解压后的路径
    cd /usr/local/solr-7.2.1
    5.进入server
    solr-webapp 文件夹下保存了 solr的项目
    solr 存放 数据仓库

    6.进入solr-webapp文件夹
    7.进入webapp
    8.进入WEB-INF
    9.修改web.xml文件中的配置 vi web.xml
    10.将security-constraint标签注释掉
    11.保存退出 :wq
    12.进入bin目录 cd /usr/local/solr-7.2.1/bin
    13. 启动服务 ./solr start -force
    14.打开浏览器 虚拟机ip地址:8983/solr/
    15.创建一个core ,必须保证服务是开启状态
    在bin目录下,输入 ./solr create -c 核心名字 -force
    16.使用远程上传文件的工具,找到三个配置文件
    进入solr解压后的路径 /usr/local/solr-7.2.1
    server--solr--mycore--conf

    managed-schema
    solrconfig.xml
    拖拽出来

    17.打开solrconfig.xml,拖拽到688行左右,增加配置
    18.新建data-config.xml,进行配置
    19.打开managed-schma,进行配置
    添加中文分词器
    配置相关字段
    20.将修改后的三个文件,在拖拽回源文件夹
    21.导入jar包
    数据导入的jar包
    数据库驱动
    分词器jar包

    将jar包复制到/usr/local/solr-7.2.1/server/solr-webapp/webapp/WEB-INF/lib

    22.重启服务,进入到solr的bin目录下,
    停止服务 ./solr stop
    启动服务 ./solr start -force

    23.刷新后台页面
    选中mycore,点击左侧 dataimport,将左下角
    auto-refresh status 点勾
    点击execute执行

    执行完毕之后,点击左侧query标签,进行查询测试
    在q的文本框中 *:*查询所有
    如果想带条件查询 列名:值 productName:男鞋白色
  • Solr是一个基于Lucene实现的开源搜索引擎,提供中文分词共, 以及快速索引
    互联网项目中的搜索功能,比如,所有新闻,所有商品,在数据量较多的情况下是不可能使用like关键字来实现的,因为效率非常低。
    同类的开源实现还有elasticsearch。

Solr 和 elasticsearch 都是lucene的开源实现,lucene本身就是一个可使用的搜索引擎,但是直接使用lucene需要额外的开发工作,而且比较复杂,成本较高,所以solr和elasticsearch属于封装了lucene,进行了简化。

  • 1.环境搭建
1
2
3
4
运行solr需要有jdk环境的支持
1.官网下载linux版的压缩包
2.将压缩包上传到虚拟机的home路径下
3.连接到虚拟机,进入到home路径下,对压缩包进行解压,解压到/usr/local下

image

  • 4.进行解压后的路径

image

  • 5.solr中自带了一个web容器,jetty,启动服务后可在浏览器中访问solr,接下来需要修改solr项目的web.xml文件
    image
  • 编辑文件
    image
  • 将文件中最后一段配置,security-constraint 标签注释掉,不注释的话启动服务后无法在浏览器中访问
    image
  • 修改后保存并且退出

6.进入bin目录,并且启动服务
image

image

  • 启动服务
    image
  • 看到如下字样 证明启动成功
    image
  • 7.在浏览器访问,首先关闭虚拟机防火墙,打开本机浏览器输入
    虚拟机ip:8983/solr
    image
  • 8.关闭solr服务 在bin目录下输入 ./solr stop 即可
    image
  • 一般来讲我们需要将数据库中的某些数据导入到solr中
    1.首先在solr中创建一个core(core可以看做是一个数据仓库)
    创建core时要保证solr是启动状态,在solr的bin目录下输入
    ./solr create -c 核心名字 –force
  • 创建一个名字叫mycore的核心
    2.创建好的core会被保存在/usr/local/solr-7.2.1/server/solr
1
2
3
4
5
6
7
8
9

4.首先打开solrconfig.xml,定位到680行左右,增加配置
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
  <lst name="defaults">
  <str name="config">data-config.xml</str>
  </lst>
 </requestHandler>

增加配置后如下
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    该配置是导入数据时一个必要配置,增加这一个配置即可,保存然后将文件关闭

    5.新建一个配置文件data-config.xml,并增加配置
    <dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.13:3306/mogujie" user="root" password="root" />
    <document>
    <entity name="product" query="select * from product">
    <field column="product_name" name="productName" />
    <field column="id" name="id" />
    <field column="product_volume" name="productVolume" />
    </entity>
    </document>
    </dataConfig>

    指定连接的数据库,用户名和密码,因为solr是根据所配置的语句,到指定的数据库中去查询,将结果集存放到solr中
    entity标签
    name属性为给该数据起个名字,不重复即可
    query 为查询语句 根据定义的查询语句 来导入数据
    field为需要导入的字段,需要哪个字段就对哪个字段配置即可,不需要全部配置
    column属性为查询后的列名,name为该字段导入到solr后的名字

    增加完配置后如下
  • jsp页面

1
2
3
4
5
6
7
8
9
10
11
12
@Controller
public class SolrContro {

@Autowired
private SolrService solrService;

@RequestMapping("/test")
public String test(@RequestParam(value="productName")String productName,ModelMap modelMap){
modelMap.addAttribute("list", solrService.getProdcut(productName));
return "test";
}
}
  • 结果页面:
  • 在WEB-INF新建jsp

image

  • 结果:
    image