solr6.3与MySQL结合使用的简明教程(三)
多对多表关系的查询
在实际应用中,我们经常会遇到多对多关系的表结构。我们在进行全文检索的时候,需要查询相关联的其他表的数据。因此,本文举了一个例子来进行说明。
为了进行搜索,我们需要数据。下面给出了 MySQL表结构的定义和相关的数据:
为了进行搜索,我们需要数据。下面给出了 MySQL表结构的定义和相关的数据:
CREATE TABLE `t_book` (
`c_id` varchar(100) NOT NULL,
`c_name` varchar(45) DEFAULT NULL,
`c_isbn` varchar(45) DEFAULT NULL,
`c_price` decimal(5,2) DEFAULT NULL,
PRIMARY KEY (`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `t_author` (
`c_id` varchar(100) NOT NULL,
`c_address` varchar(45) DEFAULT NULL,
`c_balance` decimal(9,3) DEFAULT NULL,
`c_birthday` datetime DEFAULT NULL,
`c_is_vip` bit(1) DEFAULT NULL,
`c_level` int(11) DEFAULT NULL,
`c_name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `tm_book_author` (
`c_author_id` varchar(100) NOT NULL,
`c_book_id` varchar(100) NOT NULL,
PRIMARY KEY (`c_author_id`,`c_book_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
其中t_book是书的表,t_author是作者表。tm_book_author是一个中间表,关联书和作者。tm_book_author中的c_author_id 是作者的ID。tm_book_author中的c_book_id是书的ID。书和作者是多对多的关系,一本书可以有多个作者联合编写。一个作者也可以出版多本书。本例子使用uuid作为主键。
我们把 solr-6.3.0.zip 文件解压后,放到 E:\blog\test1\solr-6.3.0 文件夹下。复制粘贴 E:\blog\test1\solr-6.3.0\example\example-DIH\solr\db 文件夹,重命名为db4。这里db文件夹和db4文件夹在同一级,是并列的关系。把mysql的Java驱动文件mysql-connector-java-5.1.40.jar 放到 db4/lib 文件夹下。
用编辑器打开 db4/conf/solrconfig.xml ,搜索一下“lib”字符串,找到下面几行:
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-cell-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/langid/lib/" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-langid-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/velocity/lib" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-velocity-\d.*\.jar" />
在这段代码下面,紧接着另起一行,加入下面的内容:
<lib dir="${solr.install.dir:../../../..}/example/example-DIH/solr/db4/lib/" regex="mysql-connector-java-5.1.40.jar" />
这么做是为了通知solr6.3 mysql的java驱动的路径。这项配置使solr可以从mysql获得数据。
使用编辑器打开 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="jynbook" processor="SqlEntityProcessor" pk="id"
query="select c_id,c_name,c_isbn,concat(c_name,' ',c_isbn) text from t_book">
<field name="id" column="c_id" />
<field name="name" column="c_name" />
<field name="isbn" column="c_isbn" />
<field name="text" column="text" />
<entity name="jynauthor"
query="select t1.c_name authorName from t_author t1 where t1.c_id in
(select t2.c_author_id from tm_book_author t2 where t2.c_book_id='${jynbook.c_id}')">
<field name="authorName" column="authorName" />
</entity>
</entity>
</document>
</dataConfig>
dataSource标签的属性是MySQL的连接配置。这是我的电脑上的配置。你需要根据你自己的情况进行配置。注意:如果密码中包含 & 符号,那么需要使用 &来进行转义。
用编辑器打开 db4/conf/managed-schema 文件。文件内容替换成下面的:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Solr managed schema - automatically generated - DO NOT EDIT -->
<schema name="example-DIH-db4" version="1.6">
<uniqueKey>id</uniqueKey>
<fieldType name="alphaOnlySort" class="solr.TextField" omitNorms="true" sortMissingLast="true">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="([^a-z])" replace="all" replacement=""/>
</analyzer>
</fieldType>
<fieldType name="ancestor_path" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/"/>
</analyzer>
</fieldType>
<fieldType name="binary" class="solr.BinaryField"/>
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
<fieldType name="currency" class="solr.CurrencyField" currencyConfig="currency.xml" defaultCurrency="USD" precisionStep="8"/>
<fieldType name="date" class="solr.TrieDateField" positionIncrementGap="0" precisionStep="0"/>
<fieldType name="descendent_path" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
</fieldType>
<fieldType name="double" class="solr.TrieDoubleField" positionIncrementGap="0" precisionStep="0"/>
<fieldType name="float" class="solr.TrieFloatField" positionIncrementGap="0" precisionStep="0"/>
<fieldType name="ignored" class="solr.StrField" indexed="false" stored="false" multiValued="true"/>
<fieldType name="int" class="solr.TrieIntField" positionIncrementGap="0" precisionStep="0"/>
<fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
<fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType" geo="true" maxDistErr="0.001" distErrPct="0.025" distanceUnits="kilometers"/>
<fieldType name="long" class="solr.TrieLongField" positionIncrementGap="0" precisionStep="0"/>
<fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType