solr怎么多表联合查询

solr怎么多表联合查询,第1张

1、将解压包中的solr-4.7.1/dist/solr-4.7.1.war复制到tomcat_dir/webapps/目录,并命名为solr.war。

2、将solr-4.7.1/example/lib/ext/目录下的jar文件复制到tomcat/lib目录下,将solr-4.7.1/example/resources/下的log4j.properties文件复制到tomcat_dir/lib目录下

切把 solr-4.7.1/example/solr,复制到tomcat_dir/bin下。

3、修改tomcat_dir/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

URIEncoding="UTF-8" />

4、创建solr.xml,存放在路径:tomcat/conf/Catalina/localhost/solr.xml,内容:

<Context path="/solr" docBase="C:\Tomcat 7.0\webapps\solr.war"

debug="0" crossContext="true">

<Environment name="solr/home" type="java.lang.String" value="C:\Tomcat 7.0\bin\solr\" override="true" />

</Context>

PS:上面的docBase和value路径中不能存在中文字符,否则会出现404错误。

5、将C:\Tomcat 7.0\webapps下的solr.war包,启动项目解压;然后再添加几个jar包:

solr-4.7.1\dist\solr-dataimporthandler-4.7.1.jar

solr-4.7.1\dist\solr-dataimporthandler-extras-4.7.1.jar

还要加载数据库驱动包:mysql-connector-java-3.1.13-bin.jar

6、在C:\Tomcat 7.0\bin\solr\collection1\conf 下的solrconfig.xml增加以下数据库配置:

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">

<lst name="defaults">

<str name="config">data-config.xml</str>

</lst>

</requestHandler>

7、将tomcat\bin\solr\collection1\conf下增加data-config.xml文件,内容如下:

<dataConfig>

<dataSource type="JdbcDataSource"

driver="com.mysql.jdbc.Driver"

url="jdbc:mysql://192.168.1.221:3306/tmsdb"

user="root"

password="123456"/>

<document name="content">

<entity name="node" query="select id,author,title,content from solrdb">

<field column="id" name="id" />

<field column="author" name="author" />

<field column="title" name="title" />

<field column="content" name="content" />

</entity>

</document>

</dataConfig>

8、增加中文分词器,ik-analyzer的配置如下:

①目前的中文分词主要有两种

1,基于中科院ICTCLAS的隐式马尔科夫hhmm算法的中文分词器,例如smartcn等。(不支持自定义扩展词库)

2,基于正向迭代最细粒度切分算法(正向最大匹配并且最细分词)例如IK,庖丁等(支持自定义扩展词库)

安装分词前,可以去下载IK的分词包 :

IK-Analyzer-4.7.1-0.0.1-SNAPSHOT.jar

下载完毕后,将此包放进tomcat\solr的\WEB-INF\lib下面:tomcat\webapps\solr\WEB-INF\lib 。

下面需要在solr的schemal.xml进行分词器注册:

<!-- 配置IK分词器 -->

<fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">

<analyzer type="index">

<!-- 分词-->

<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>

<!-- 禁用词过滤根据情况使用-->

<!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/>-->

</analyzer>

<analyzer type="query">

<!-- 分词-->

<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>

<!-- 禁用词过滤根据情况使用-->

<!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/>-->

</analyzer>

</fieldType>

最后还得配置一个引用字段就OK了

<field name="ik" type="text_ik" indexed="true" stored="true" multiValued="true"/>

②它的安装部署十分简单,将IKAnalyzer2012.jar部署亍项目的lib目录中;IKAnalyzer.cfg.xml不stopword.dic文件放置在class根目录(对于web项目,通常是WEB-I NF/classes目彔,同hibernate、log4j等配置文件相同)下即可 ;然后配置solr4.7中schema.xml配置解析器:

<schema name="example" version="1.1">

……

<fieldType name="text" class="solr.TextField">

<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

</fieldType>

……

</schema>

处理高并发的六种方法

1:系统拆分,将一个系统拆分为多个子系统,用dubbo来搞。然后每个系统连一个数据库,这样本来就一个库,现在多个数据库,这样就可以抗高并发。

2:缓存,必须得用缓存。大部分的高并发场景,都是读多写少,那你完全可以在数据库和缓存里都写一份,然后读的时候大量走缓存不就得了。毕竟人家redis轻轻松松单机几万的并发啊。没问题的。所以你可以考的虑考虑你的项目里,那些承载主要请求读场景,怎么用缓存来抗高并发。

3:MQ(消息队列),必须得用MQ。可能你还是会出现高并发写的场景,比如说一个业务 *** 作里要频繁搞数据库几十次,增删改增删改,疯了。那高并发绝对搞挂你的系统,人家是缓存你要是用redis来承载写那肯定不行,数据随时就被LRU(淘汰掉最不经常使用的)了,数据格式还无比简单,没有事务支持。所以该用mysql还得用mysql啊。那你咋办?用MQ吧,大量的写请求灌入MQ里,排队慢慢玩儿,后边系统消费后慢慢写,控制在mysql承载范围之内。所以你得考虑考虑你的项目里,那些承载复杂写业务逻辑的场景里,如何用MQ来异步写,提升并发性。MQ单机抗几万并发也是ok的。

4:分库分表,可能到了最后数据库层面还是免不了抗高并发的要求,好吧,那么就将一个数据库拆分为多个库,多个库来抗更高的并发;然后将一个表拆分为多个表,每个表的数据量保持少一点,提高sql跑的性能。

5:读写分离,这个就是说大部分时候数据库可能也是读多写少,没必要所有请求都集中在一个库上吧,可以搞个主从架构,主库写入,从库读取,搞一个读写分离。读流量太多的时候,还可以加更多的从库。

6:solrCloud:

SolrCloud(solr 云)是Solr提供的分布式搜索方案,可以解决海量数据的 分布式全文检索,因为搭建了集群,因此具备高可用的特性,同时对数据进行主从备份,避免了单点故障问题。可以做到数据的快速恢复。并且可以动态的添加新的节点,再对数据进行平衡,可以做到负载均衡:

在solr与tomcat整合文章中,我用的索引库是mycore,现在就以这个为例。

首先要准备jar包:solr-dataimporthandler-4.8.1.jar、solr-dataimporthandler-extras-4.8.1.jar和mysql-connector-java-5.0.7-bin.jar这三个包到solr的tomcat的webapps\solr\WEB-INF\lib下

在这个文件夹的conf下配置两个文件,添加一个文件。先配置solrconfig.xml。

在该文件下添加一个新节点。

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">

<lst name="defaults">

<str name="config">data-config.xml</str>

</lst>

</requestHandler>

在solrconfig.xml的同目录下创建data-config.xml。

配置:

复制代码

<dataConfig>

<dataSource type="JdbcDataSource"

driver="com.mysql.jdbc.Driver"

url="jdbc:mysql://localhost:3306/courseman"

user="root"

password="mysql" />

<document>

<entity name="student"

query="SELECT * FROM student">

<field column="id" name="id" />

<field column="name" name="name" />

<field column="gender" name="gender" />

<field column="major" name="major" />

<field column="grade" name="grade" />

</entity>

</document>

</dataConfig>

复制代码

schemal.xml的配置

复制代码

<?xml version="1.0" ?>

<!--

Licensed to the Apache Software Foundation (ASF) under one or more

contributor license agreements. See the NOTICE file distributed with

this work for additional information regarding copyright ownership.

The ASF licenses this file to You under the Apache License, Version 2.0

(the "License")you may not use this file except in compliance with

the License. You may obtain a copy of the License at

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

-->

<schema name="example core one" version="1.1">

<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>

<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>

<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>

<!-- general -->

<field name="id" type="int"indexed="true" stored="true" />

<field name="gender" type="string"indexed="true" stored="true" />

<field name="name" type="string"indexed="true" stored="true" />

<field name="major" type="string"indexed="true" stored="true" />

<field name="grade" type="string"indexed="true" stored="true" />

<field name="_version_" type="long" indexed="true" stored="true"/>

<!-- field to use to determine and enforce document uniqueness. -->

<uniqueKey>id</uniqueKey>

<!-- field for the QueryParser to use when an explicit fieldname is absent -->

<defaultSearchField>name</defaultSearchField>

<!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->

<solrQueryParser defaultOperator="OR"/>

</schema>

复制代码

默认的文件不是这样的,稍微改动了一下。

field 的type类型是根据fieldtype 的name定义的。class是solr自定义的不能更改。

shcema.xml文件的field字段的属性介绍:

(1)name:字段名称

(2)type:字段类型(此处type不是java类型,而是下面定义的fieldType)

(3)indexed:是否索引看true--solr会对这个字段进行索引,只有经过索引的字段才能被搜索、排序等;false--不索引

(4)stored:是否存储看true--存储,当我们需要在页面显示此字段时,应设为true,否则false。

(5)required:是否必须看true--此字段为必需,如果此字段的内容为空,会报异常;false--不是必需

(6)multiValued:此字段是否可以保存多个值看

(7)omitNorms:是否对此字段进行解析看有时候我们想通过某个字段的完全匹配来查询信息,那么设置 indexed="true"、omitNorms="true"。

(8)default:设置默认值

有这样一个FieldType描述:

<fieldType name="text_general" positionIncrementGap="100">

<analyzer type="index">

<tokenizer/>

<filter ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />

<filter/>

</analyzer>

<analyzer type="query">

<tokenizer/>

<filter ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />

<filter synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

<filter/>

</analyzer>

</fieldType>

属性说明:

(1)name:类型名称,<field>中的type引用的就是这个name

(2)class:solr自定义的类型

(3)<analyzer type="index">定义建立索引时使用的分词器及过滤器

(4)<analyzer type="query">定义搜索时所使用的分词器及过滤器

(5)<tokenizer/>定义分词器

(6)<filter/>定义过滤器

uniqueKey属性

<uniqueKey>id</uniqueKey>

类似于数据表数据的id,solr索引库中最好定义一个用于标示document唯一性的字段,此字段主要用于删除document。

defaultSearchField属性

就是你在做query搜寻时若不指定特定栏位做检索时, Solr就会只查这个栏位.

<defaultSearchField>default</defaultSearchField>

copyField属性

是用来复制你一个栏位里的值到另一栏位用. 如你可以将name里的东西copy到major里, 这样solr做检索时也会检索到name里的东西.

<copyField source="name" dest="major"/>

现在可以将数据库的数据导入solr了。

点击Execute就可以了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10080465.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存