Solr 是一种可供企业使用的、基于 Lucene 的搜索服务器,它支持层面搜索、命中醒目显示和多种输出格式。在这篇文章中,将介绍 Solr 并展示如何轻松地将其表现优异的全文本搜索功能加入到 Web 应用程序中。
下载地址:https://lucene.apache.org/solr/downloads.html
本文中使用的Solr 版本:7.7.2,因为我是用的是 Windows 系统,所以主要介绍的是 Windows 下的部署方法。
安装
Solr 内置了 Jetty,所以不需要任何安装任何 Web 容器即可运行。直接通过命令行就可以启动。
启动 Solr:
.\solr.cmd start
停止 Solr:
.\solr.cmd stop -all
创建 Core
首先在 server\solr 文件夹中创建一个新的目录,然后将 server\solr\configsets\_default 下的 conf 目录复制到刚刚创建的文件夹。
在浏览器中打开 :8983/solr/ 点击左侧的 Core Admin 添加 Core。
name 和 instanceDir 都改成刚刚创建的目录名称。
创建好之后即可在左侧的 Core Selector 中找到这个 Core。
现在一个 Core 就创建好了,在 Core 的面板里可以对其进行一些基本操作。
Solr 的 Api 是支持通过调用接口添加数据的,但是在实际使用中我们都是从数据库中同步数据,所以我们需要为 Solr 配置数据源。
在 solrconfig.xml 文件中找到如下内容:
<!-- Request Handlers
Incoming queries will be dispatched to a specific handler by name
based on the path specified in the request.
If a Request Handler is declared with startup="lazy", then it will
not be initialized until the first request that uses it.
-->
添加一个 requestHandler 节点:
<requestHandler>
<lst>
<str>data-config.xml</str>
</lst>
</requestHandler>
data-config.xml 文件的大致结构如下:
稍后会对 data-config.xml 文件进行详细介绍。
配置数据源
使用 SQL Server 数据源
从微软官网下载 SQL Server 的 Microsoft SQL Server JDBC 驱动程序 4.1 驱动,复制到 server\solr-webapp\webapp\WEB-INF\lib 目录下。
这里需要注意的是把在下载的文件重命名为 sqljdbc4.jar,我之前没有改名死活加载不上。
使用 com.microsoft.sqlserver.jdbc.SQLServerDriver 驱动配置数据源:
<dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://127.0.0.1:1433;SelectMethod=Cursor;DatabaseName=post;useLOBs=false;loginTimeout=60" user="charlestest" password="12345678" />
使用 MySQL 数据源
下载:mysql-connector-java-6.0.6.jar 复制到 server\solr-webapp\webapp\WEB-INF\lib 目录下。
从 dist 目录复制 solr-dataimporthandler-7.7.2.jar 到 server/solr-webapp/webapp/WEB-INF/lib 中。
配置 data-config.xml:
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/posts?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC" user="root" password="12345678" batchSize="-1" />
<document>
<entity dataSource="postData" pk="Id" transformer="DateFormatTransformer,HTMLStripTransformer" rootEntity="true" query="SELECT Id, post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count
FROM wp_posts"
deltaQuery="SELECT Id, post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count
FROM wp_posts post_modified >'${dataimporter.last_index_time}' "
>
<field column="Id" />
<field column="post_author" />
<field column="post_date" dateTimeFormat='yyyy-MM-dd HH:mm:ss'/>
<field column="post_date_gmt" dateTimeFormat='yyyy-MM-dd HH:mm:ss'/>
<field column="post_content" />
<field column="post_title" />
<field column="post_excerpt" />
<field column="post_status" />
<field column="comment_status" />
<field column="ping_status" />
<field column="post_password" />
<field column="post_name" />
<field column="to_ping" />
<field column="pinged" />
<field column="post_modified" dateTimeFormat='yyyy-MM-dd HH:mm:ss'/>
<field column="post_modified_gmt" dateTimeFormat='yyyy-MM-dd HH:mm:ss'/>
<field column="post_content_filtered" />
<field column="post_parent" />
<field column="guid" />
<field column="menu_order" />
<field column="post_type" />
<field column="post_mime_type" />
<field column="comment_count" />
<entity dataSource="authordata" pk="Id" query="SELECT Id, user_login, user_pass, user_nicename, user_email, user_url, user_registered, user_activation_key, user_status, display_name
FROM wp_users where id=${Post.post_author}">
<field column="Id" />
<field column="user_login"/>
<field column="user_pass"/>
<field column="user_nicename"/>
<field column="user_email"/>
<field column="user_url"/>
<field column="user_registered"/>
<field column="user_activation_key"/>
<field column="user_status"/>
<field column="display_name"/>
</entity>
</entity>
</document>
</dataConfig>
entity 中的一些常用属性:
query:查询只对第一次全量导入有作用,对增量同步不起作用。