solrCloud集群搭建(solr-6.5.1,zookeeper-3.4.10)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013266867/article/details/83016583

Solr 是一个基于 Apache Lucene 之上的搜索服务器,它是一个开源的、基于 Java 的、运行在Servlet容器(如Apache TomcatJetty)的信息检索库。它旨在驱动功能强大的文档检索应用程序 - 无论您需要根据用户的查询将数据服务到何处,Solr 都可以为您服务。

下面是一个如何将 Solr 集成到应用程序中的示例:

采用伪集群部署方式,在同一台服务器上部署3个zookeeper,3个solr服务。结构如下图:

1,下载压缩包,zookeeper,solr

2,部署zookeeper集群,(部署单个,拷贝多个)

3,solr部署

      solr-6.5.1.tgz解压命名为solr-1

4,solr关联zookeeper

扫描二维码关注公众号,回复: 3931673 查看本文章

      配置solr和zookeeper,在solr-1/bin 目录下 ,solr.in.sh文件中,加入如下参数,并复制solr-1,粘贴为solr-2,solr-3。

ZK_HOST="10.1.88.101:2281,10.1.88.101:2282,10.1.88.101:2283"

5,更改solr-2,solr-3的启动端口 

 因为是在同一台机器上部署,所以要更改各个solr节点的默认启动端口。以solr-1为例,默认是8983,我改为8985.

 /srv/new_solr/solrCloud/solr-1/bin 目录下的 solr.in.sh 文件

SOLR_PORT=8985

 /srv/new_solr/solrCloud/solr-1/server/etc 目录下的 jetty-https.xml文件

<Set name="port"><Property name="solr.jetty.https.port" default="8985" /></Set>

执行启动命令

/srv/new_solr/solrCloud/solr-1/bin/./solr start

solr-2,solr-3也是一样

启动成功后,进入一个节点,我的是 http://10.1.88.101:8985/solr/#/ 左侧能看到Cloud菜单,即是Cloud模式 

6,创建collection的配置文件并上传。

我的配置文件是myconf,这个可以从/srv/new_solr/solrCloud/solr-1/server/solr/configsets/ 下复制sample_techproducts_configs 文件夹到solr-1的根目录,命名为myconf,作为要创建的collection的配置文件名。

cp -rf /srv/new_solr/solrCloud/solr-1/server/solr/configsets/sample_techproducts_configs/* /srv/new_solr/solrCloud/solr-1/myconf

进入/srv/new_solr/solrCloud/solr-1/server/scripts/cloud-scripts 目录,利用./zkCli.sh 上传solr的配置文件到zookeeper,如下命令,myconf是要上传的配置文件名,file_bank是上传后的显示名。

cd /srv/new_solr/solrCloud/solr-1/server/scripts/cloud-scripts/
./zkcli.sh -zkhost 10.1.88.101:2281,10.1.88.101:2282,10.1.88.101:2283 -cmd upconfig -confdir /srv/new_solr/solrCloud/solr-1/myconf/ -confname file_bank

7,创建collections

上传成功后,在solr 后台创建collection时可以看到之前命名的配置文件file_bank。

创建时参数解析

name:将被创建的集合的名字
numShards:集合创建时需要创建逻辑碎片的个数
replicationFactor:分片的副本数。replicationFactor(复制因子)为 3 意思是每个逻辑碎片将有 3 份副本。
maxShardsPerNode:默认值为1,每个Solr服务器节点上最大分片数(4.2新增的)
注意三个数值:numShards、replicationFactor、liveSolrNode(当前存活的solr节点),一个正常的solrCloud集群不容许同一个liveSolrNode上部署同一个shard的多个replic,因此当maxShardsPerNode=1时,numShards*replicationFactor>liveSolrNode时,报错。因此正确时因满足以下条件:numShards*replicationFactor<liveSolrNode*maxShardsPerNode

如有错误collections,执行删除语句 

 http://10.1.88.101:8985/solr/admin/collections?action=DELETE&name=file_bank 

8,分词器配置,我选的是smart分词,这个lucene-analyzers-smartcn-6.5.1.jar包是在/srv/new_solr/solrCloud/solr-1/contrib/analysis-extras/lib下,所以修改solrconfig.xml,添加分词器jar包位置 

<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs" regex=".*\.jar" />

 修改manged-schema.xml,增加一个新的fileType 类型,并指定分词类型是smart

<fieldType name="text_smart" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
    </analyzer>
    <analyzer type="query">
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
    </analyzer>
</fieldType>

 创建一个新的field 命名为 file_text_search_all ,并将需要分词的字段copy进来。

<field name="file_text_search_all" type="text_smart" indexed="true" stored="true" multiValued="true" />
<!-- 为多个field指定一个共同的别名,通过这个别名进行query就能够同时对所有field进行搜索 -->
<copyField source="fileBank_teacherName_s" dest="file_text_search_all"/>
<copyField source="fileBankName_s" dest="file_text_search_all"/>
<copyField source="fileSchoolName_s" dest="file_text_search_all"/>
<copyField source="fileMajorName_s" dest="file_text_search_all_s"/>
<copyField source="fileSubjectName_s" dest="file_text_search_all"/>
<copyField source="fileTypeName_s" dest="file_text_search_all"/>
<copyField source="fileYear_s" dest="file_text_search_all"/>

9,更新配置文件,每次修改manage-schema,都需要执行上传操作,即下述命令

cd /srv/new_solr/solrCloud/solr-1/server/scripts/cloud-scripts/
./zkcli.sh -zkhost 10.1.88.101:2281,10.1.88.101:2282,10.1.88.101:2283 -cmd upconfig -confdir /srv/new_solr/solrCloud/solr-1/myconf/ -confname file_bank

10,查看分词示例 

    collection选择file_bank,在Analysis菜单中,选择file_text_search_all 字段,输入待分词文本

 分词结果如下

11,配置停词表,stopwords.txt

12,solrj的使用

 连接SolrCloud,创建CloudSolrClient

13,批量创建时提高提交速度,设置软提交,硬提交

     <autoCommit>
        <maxTime>${solr.autoCommit.maxTime:15000}</maxTime>
        <maxDocs>100000</maxDocs>
        <openSearcher>false</openSearcher>
     </autoCommit>

     <autoSoftCommit>
        <maxTime>${solr.autoSoftCommit.maxTime:15000}</maxTime>
        <maxDocs>10000</maxDocs>
     </autoSoftCommit>

14,使用中遇到问题---相似度算法

solr6.5的变化

托管模式现在是默认的

当 solrconfig.xml 没有明确定义 <schemaFactory/> 的时候,Solr 的默认行为现在依赖于 solrconfig.xml 定义的 luceneMatchVersion。当 luceneMatchVersion < 6.0 时,ClassicIndexSchemaFactory 将继续用于后向兼容,否则将使用 ManagedIndexSchemaFactory 的实例。

这种变化最显著的影响是:

  • 现有的 solrconfig.xml 文件被修改为使用 luceneMatchVersion >= 6.0,但没有明确配置 ClassicIndexSchemaFactory,将其 schema.xml 文件自动升级到managed-schema 文件。
  • 现在将默认启用通过 Schema API 进行的模式修改。

默认的相似性改变

当 Schema 没有明确地定义全局 <similarity/> 时,Solr 的默认行为将依赖于 solrconfig. xml 中指定的 luceneMatchVersion。当 luceneMatchVersion < 6.0 时,将使用 ClassicSimilarityFactory 的实例,否则将使用 SchemaSimilarityFactory 的实例。最值得注意的是,这种改变意味着用户可以利用每个字段类型的相似性声明,并且需要明确声明 SchemaSimilarityFactory 的全局用法。

无论是明确声明还是作为隐式全局默认值使用,当字段类型不声明明确 <similarity/> 时,SchemaSimilarityFactory 的隐式行为也被更改为依赖于 luceneMatchVersion。当 luceneMatchVersion < 6.0 时,将使用 ClassicSimilarity 的实例,否则将使用 BM25Similarity 的实例。可以在 SchemaSimilarityFactory 声明中指定 defaultSimFromFieldType init 选项来更改此行为。请查看 SchemaSimilarityFactoryjavadocs 了解更多详情

TF---词频                     标题分词  1/100

IDF---逆向文件频率   命中率    log(1000/10)=2

TF*IDF=0.02

搜索(好人做小事)

做大好事

我大好人

做好事

好人

做大事

好人小事是大事

小 (3*1)

猜你喜欢

转载自blog.csdn.net/u013266867/article/details/83016583