书单推荐:成为Java顶级程序员架构师 ,这20来本(高薪)必看点击获取
一张表里查询多个字段
在 前一篇教程里面,我们加了个db2内核。如果用户在系统里面的搜索框内输入一段文字,这段文字即可能是书名,也有可能是书的ISBN号,那么我们应该怎么做呢?
找到 solr目录/example/example-DIH/solr/db2/conf/ 文件夹。打开 db-data-config.xml 文件。找到entity标签,更改query属性里面的SQL语句。利用MySQL的concat函数拼接一下两个字段的内容,并为这个新的返回列分配一个新的field。修改后的代码如下:
<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/db1" user="test_user" encoding="UTF-8" password="123456"/> <document> <entity name="jynbook" processor="SqlEntityProcessor" pk="id" query="select c_id,c_name,c_isbn,concat(c_name,' ',c_isbn) zcq from t_book"> <field name="id" column="c_id" /> <field name="name" column="c_name" /> <field name="isbn" column="c_isbn" /> <field name="zcq" column="zcq" /> <!-- zcq是新加的 --> </entity> </document></dataConfig>
zcq就是我们新加的两字段一块查询的属性。
同时,我们要修改 managed-schema 文件。找到我们在 前一篇教程 里面加入的field标签,在其中再加入一个新的zcq标签。加完后的代码如下,仅仅显示关键代码:
<field name="zcq" type="string" indexed="true" stored="true"/>
重启solr并导入数据,就可以利用 zcq 进行检索了。
多张并列关系的表,导入并查找数据
准备测试用的数据。下面是建立表结构的DDL:
CREATE DATABASE `db3` /*!40100 DEFAULT CHARACTER SET utf8 */;use db3;CREATE TABLE `db3`.`tb1` ( `c_id` INT NOT NULL AUTO_INCREMENT, `c_name` VARCHAR(45) NULL, `c_num` INT NULL, PRIMARY KEY (`c_id`));CREATE TABLE `tb2` ( `c_id` int(11) NOT NULL AUTO_INCREMENT, `c_title` varchar(45) DEFAULT NULL, `c_balance` decimal(9,2) DEFAULT NULL, PRIMARY KEY (`c_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
表tb1和表tb2之间是并列的,没有依赖关系,也没有一对一,一对多,多对多的关系。只是单纯的业务需求,用户点击搜索后既要搜索表tb1,也要搜索tb2。这种场景比较常见,比如说即要搜索相关的博客,又要搜索相关的帖子。把我们原来的db2文件夹复制粘贴并重新命名为db3。并且做以下修改。
db-data-config.xml
<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/db1" user="root" encoding="UTF-8" password="123456"/> <document> <entity name="e0" processor="SqlEntityProcessor" pk="id" query="SELECT c_id,c_name,c_num,concat('tb1_',c_id) tb1_id, concat(c_name,' ', c_num) zcq FROM db3.tb1"> <field name="id" column="tb1_id" /> <field name="displayText" column="c_name" /> <field name="zcq" column="zcq" /> </entity> <entity name="e1" processor="SqlEntityProcessor" pk="id" query="SELECT c_id,c_title,c_balance,concat('tb2_',c_id) tb2_id, concat(c_title,' ',c_balance) zcq FROM db3.tb2"> <field name="id" column="tb2_id" /> <field name="displayText" column="c_title" /> <field name="zcq" column="zcq" /> </entity> </document></dataConfig>
managed-schema 前后代码省略。
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/> <field name="displayText" type="string" indexed="true" stored="true"/> <field name="zcq" type="string" indexed="true" stored="true"/> <field name="_version_" type="long" indexed="true" stored="true"/>
solrconfig.xml mysql驱动的jar包路径也要改一下,前后代码省略:
<lib dir="E:/blog/test1/solr-6.3.0/example/example-DIH/solr/db3/lib/" regex="mysql-connector-java-5.1.40.jar" />