全文索引----创建多表solr索引

我们在使用solr作为索引服务器时,通常会将多个表的多个字段作为联合索引,对多个表快速的数据查询也是solr服务器高效率的体现。这片文章介绍下如何基于多个数据表创建索引。

一 无关联多表创建索引

1.1 数据库准备

我们使用任意的两个表作为数据源,这两个表可以属于一个数据库,也可以属于不同的数据库,如果使用两个数据库,则需要两个数据源连接字符串,我们这里使用同一个库的两个表作为示例。

两个表结构如下:

表一:

表二:

1.2 配置data-config.xml

我们之前已经配置好了solr服务器,所以只需要修改数据源配置文件和索引配置文件即可。数据源文件配置如下:

<dataSource name="jfinal_demo" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" 
url="jdbc:mysql://192.168.21.20:3306/jfinal_demo" user="root" password="123456" batchSize="-1" />
  	<document name="testDoc">
		<entity name="user" dataSource="jfinal_demo" pk="id" query="select * from user">
			<field column="id" name="userId"/>
     	<span style="white-space:pre">	</span><field column="userName" name="userName"/>
			<field column="userAge" name="userAge"/>
			<field column="userAddress" name="userAddress"/>
		</entity>
		<entity name="role" pk="id" query="select * from role" >
			<field column="id" name="roleId"/>
			<field column="name" name="roleName"/>
		</entity>
	</document>

说明:dataSource标签是数据库连接字符串,name属性作为连接字符串标识符,type是数据源类型,我们这里选用jdbc数据源JdbcDataSource,drive是数据驱动,选择MySQL数据驱动,URL是数据库连接字符串。

document标签下添加我们需要索引的数据,entity代表一个实体,name属性用来区分不同的实体,pk属性时数据表的主键,这个属性必须要和数据表主键一致,不能修改。

field标签是需要索引的字段,column是数据列,name是别名。

注意:设置主键是需要特别注意,如果两个表的主键数据一致,则后面的索引会覆盖掉前边的索引,但是很多情况是,我们使用自增长的数据作为主键,这样不可避免的就会产生主键一致情况,百度了一下,解决方法大致有两种:

1 主键使用uuid格式,从根本上避免逐渐一致情况,并且比较安全。

2 去掉schema.xml中uniqueKey属性,或者在表中新建一个字段作为uniqueKey属性。

1.3 配置schema.xml

将表中所有需要索引的字段添加到文件中fields标签下,注意,相同的字段就不想要添加了,例如ID。配置如下:

1.4 重启solr服务,测试。

二 关联表创建索引

有关联表创建索引的步骤和无关联表一致,只是data-config.xml配置不同,具体如下。

2.1 数据库结构图如下:

2.2 data-config.xml配置如下:

<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.21.20:3306/jrkj_java" user="root" password="123456" batchSize="-1" />
	<document name="testDoc">
		<entity name="tj_student" pk="id" query="SELECT id,nickName,isDelete FROM tj_student where isDelete = 0 and applyTeacherState = 1 and isTeacher = 1">
			<field column="id" name="id"/>
			<field column="nickName" name="nickName"/>
			<field column="isDelete" name="isDelete"/>
			<entity name="tj_course" pk="id" query="select id,courseName from tj_course where isDelete=0 and courseAuditState=1 and studentId='${tj_student.id}'">
				<field column="id" name="courseId"/>
				<field column="courseName" name="courseName"/>
 			</entity>
			<entity name="tj_userfield" pk="id" query="select fieldId,studentId from tj_userfield where isDelete = 0 and userFieldType = 1 and studentId = '${tj_student.id}'">
				<field column="fieldId" name="fieldId"/>
				<field column="studentId" name="studentId"/>
				<entity name="tj_field" pk="id" query="select fieldName,pointWord from tj_field where isDelete = 0 and id='${tj_userfield.fieldId}'">
					<field column="fieldName" name="fieldName"/>
					<field column="pointWord" name="pointWord"/>
				</entity>
			</entity>
			<entity name="tj_userIndustry" pk="id" query="select industryId from tj_userindustry where isDelete = 0 and userIndustryType = 1 and studentId = '${tj_student.id}'">
				<field column="industryId"/>
				<entity name="tj_industry" pk="id" query="select industryName from tj_industry where isDelete = 0 and id = '${tj_userIndustry.industryId}'">
					<field column="industryName" name="industryName"/>
				</entity>
			</entity>
		</entity>
  </document>

除了上面这种形式,官网给了第二种方式,结构如下:

<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.21.20:3306/jrkj_java" user="root" password="123456" batchSize="-1" />
	<document name="testDoc">
		<entity name="tj_student" pk="id" query="SELECT id,nickName,isDelete FROM tj_student where isDelete = 0 and applyTeacherState = 1 and isTeacher = 1">
			<entity name="tj_course" pk="id" query="select id,courseName from tj_course where isDelete=0 and courseAuditState=1 and studentId='${tj_student.id}'">
 			</entity>
			<entity name="tj_userfield" pk="id" query="select fieldId,studentId from tj_userfield where isDelete = 0 and userFieldType = 1 and studentId = '${tj_student.id}'">
				<entity name="tj_field" pk="id" query="select fieldName,pointWord from tj_field where isDelete = 0 and id='${tj_userfield.fieldId}'">
				</entity>
			</entity>
			<entity name="tj_userIndustry" pk="id" query="select industryId from tj_userindustry where isDelete = 0 and userIndustryType = 1 and studentId = '${tj_student.id}'">
				<entity name="tj_industry" pk="id" query="select industryName from tj_industry where isDelete = 0 and id = '${tj_userIndustry.industryId}'">
				</entity>
			</entity>
		</entity>
  </document>

2.3 配置schema.xml

配置如下:

2.4 重启solr服务,测试。

三 总结

多表索引是solr服务器最常见的索引方式,因为索引关键字很容易重复,特别是主键容易出错,所以创建索引时需要非常小心。

时间: 2024-11-14 12:44:31

全文索引----创建多表solr索引的相关文章

让你提前知道软件开发(27):创建数据库表和索引

文章2部分 数据库SQL语言 数据库表及索引的创建         数据表(或称表),是数据库最重要的组成部分之中的一个.数据库仅仅是一个框架.数据表才是事实上质的内容.举个样例来说,数据库就像是一座空旷的房子.而数据表是里面的家具,没有家具的房子仅仅是一个空壳而已.依据信息的分类情况,一个数据库中可能包括若干个不同用途的数据表. 表结构有简单.有复杂,这就对开发者提出了要求. 怎样设计一个表的字段才是最好的?表的字段怎样命名?怎样定义表字段的类型?怎样建立索引?等等. 1. 改动之前的建表脚本

oracle的学习 第二节:创建数据表

学习内容: A.创建数据库和表空间 B.创建用户和分配权限 C.创建数据表 一.创建数据库和表空间 (一)SQL语言的基本概念 1.概念 高级的结构化查询语言:沟通数据库服务器和客户的重要桥梁. PL/sql语言是结构化的查询语言. 2.分类: 数据定义语言  :create  alter  drop 数据操作语言: insert update delete 数据控制语言:select (二)创建数据库的两种方式 方式一:图形界面: 方式二:create  Datebase命令方法.(常用) 具

MySQL在创建数据表的时候创建索引

转载:http://www.baike369.com/content/?id=5478 MySQL在创建数据表的时候创建索引 在MySQL中创建表的时候,可以直接创建索引.基本的语法格式如下: CREATE TABLE 表名(字段名 数据类型 [完整性约束条件], [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY [索引名](字段名1 [(长度)] [ASC | DESC]) ); UNIQUE:可选.表示索引为唯一性索引. FULLTEXT:可选.表示索引为全

spool命令、创建一个表,创建并且copy表,查看别的用户下的表,rowid行地址 索引的时候使用,表的增删改查,删除表,oracle的回收站

  1.spool命令 spool "D:\test.txt" spool off SQL> host cls 2.创建一个表 SQL> --条件(1):有创建表的权限,(2):有表空间 SQL> desc t4; 名称                                      是否为空? 类型 ----------------------------------------- -------- ------------------------

mssql2000数据库执行SQL语句来创建数据库以及数据表还有索引

创建数据库MSsql2000Create DATABASE databasename on primary (name='databasename_data',filename='C:\databasename_data.mdf',size=3mb,maxsize=UNLIMITED,filegrowth=10%)log on (name='databasename_log',filename='C:\databasename_log.ldf',size=3mb,filegrowth=10%)

Oracle创建表、索引、主键、字段描述

-- 创建表 create table SX04_LBALANCE ( YEAR VARCHAR2(10) not null, PROGRAMNO VARCHAR2(40) not null, FDATE VARCHAR2(10) not null, FACCTCODE VARCHAR2(50) not null, FCURCODE VARCHAR2(3) not null, FAACCCREDIT NUMBER(19,4) default 0 not null, FAENDBAL NUMBER

让你提前认识软件开发(27):数据库表及索引的创建

第2部分 数据库SQL语言 数据库表及索引的创建         数据表(或称表),是数据库最重要的组成部分之一.数据库只是一个框架,数据表才是其实质的内容.举个例子来说,数据库就像是一座空旷的房子,而数据表是里面的家具,没有家具的房子只是一个空壳而已.根据信息的分类情况,一个数据库中可能包含若干个不同用途的数据表. 表结构有简单.有复杂,这就对开发人员提出了要求.如何设计一个表的字段才是最好的?表的字段如何命名?如何定义表字段的类型?如何建立索引?等等. 1. 修改之前的建表脚本 在作者从事过

使用Solr索引MySQL数据

环境搭建 1.到apache下载solr,地址:http://mirrors.hust.edu.cn/apache/lucene/solr/ 2.解压到某个目录 3.cd into D:\Solr\solr-4.10.3\example 4.Execute the server by “java -jar startup.jar”Solr会自动运行在自带的Jetty上 5.访问http://localhost:8983/solr/#/ 创建MySQL数据 DataBase Name: mybat

Mysql建表与索引使用规范详解

一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三. MySQL建表,如果字段等价于外键,应在该字段加索引. 四. MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比. 五. MySQL使用时,一条SQL语句只能使用一个表的一个索引.所有的字段类型都可以索引,多列索引的属性最多15个. 六. 如果可以在多个索引中进行选择,My