通过上一期的Sor学习(一)安装与部署,我们学习了怎么安装solr以及简单的使用,这一期开始进入同步MongoDB数据。该文章内容皆是由我重新搭建试验过可行的,按照步骤你们也一定能成功。文章所需安装包都在文末,需要的同学自取。

安装python

SolrMongoDB同步数据需要用到mongo-connector这个东西,这个东西怎么安装呢,需要用pip安装,所以我们先安装python,python只是我们的包安装工具,与同步数据没有关系,python官网,我们安装python3,选择下面这个安装,如果下载慢用我文末的链接。

python下载

下面要选中添加python环境变量,然后next,next。

python安装

安装完成后我们打开cmd输入python --version查看是否能显示python版本号,如果有说明就安装成功了。默认安装的pip版本不符合我们的要求(我也记不清是哪个版本了···),我们将pip升级到最新版,输入以下命令

pip install -U pip -i http://pypi.douban.com/simple --trusted-host pypi.douban.com这里我们使用的是豆瓣的pip资源来下载,不然实在是太慢了,慢就意味着失败。

安装mongo-connector

mongo-connector,将mongodb与solr连接起来,官方文档不用细细去看,按照我的步骤往下执行就可以。

mongo-connector

我们先安装两个包 mongo-connectormongo-connector[solr]打开cmd分别输入下面两个命令

  • mongo-connector:pip install mongo-connector -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  • mongo-connector[solr]:pip install mongo-connector[solr] -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

pip安装mongo-connctor

这是下载成功的画面显示。

创建mongodb副本集

因为我们只是简单使用,所以不用创建那么多连接,我们只需要创建一个主服务器就可以了。

找到mongodb安装目录下的mongod.cfg文件

mongod.cfg

在以下位置添加副本集配置

副本集配置

replication:
 replSetName: kbReplSet
 oplogSizeMB: 1024

replSetName自定义副本集名称,添加完需要重启mongodb。

指定副本集

mongo-connector复制来自MongoDB oplog的操作,因此在启动之前必须运行一个副本集。我们在mongodb安装目录下的bin文件夹下打开cmd,执行mongod --replSet kbReplSet

指定副本集

哪有那么简单,报错了··· 我们看报错信息,提示我们没有找到D盘符下的data/db文件夹。我们需要去创建,一般你的mongodb安装在哪个盘符下就会提示在哪个盘符下创建。

副本集指定成功

这是指定成功的界面,不要关闭!!!不要关闭!!!不要关闭!!!

接下来我们要把服务器初始化为一个副本集,在bin文件夹下再打开一个cmd窗口,执行mongo命令,进入到mongodb的命令行界面,输入rs.initiate()

初始化为副本集

好了,kbReplSet已经被我们初始化为副本集了,mongodb端的配置已经结束,我们去配置solr文件。

配置core

上一期我讲了怎么添加一个core,在solr的bin目录下打开cmd窗口执行solr create -c corename

创建完之后我们打开 managed-schema文件

managed-schemasolr与mongodb字段的配置都在这里,这里我多讲一下 managed-schema的配置,与本文关系不大可以跳过。

managed-schema配置

managed-schema文件原名是schema.xml ,具体从solr哪个版本改为managed-schema的不太清楚,网上很多文章都提到了schema.xml,这就让很多小白(也包括我)头疼了,哪有这个文件啊,其实是改名了,以后再遇到让找schema.xml文件的,去找managed-schema就对了。

field

 定义Solr索引的document里的字段,这个一般是根据具体的搜索应用来定义需要有什么字段。有三个特殊一点的字段,分别是:_version_, _root_id

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

属性 默认值 说明
name 必须,不能取名score,前后辍为下划线的名字(如:VERSION)为保留名字
type 必须。值为定义的
indexed true 是否进行索引。 true的时候进行索引。
stored true 是否存储。如果此字段的值需要显示在搜索结果中,则需要进行存储。
docValues false 是否需要存储docValues。docValues用于提升sorting, faceting, grouping, function queries等性能,现在仅支持StrField, UUIDFiel和所有的Trie*Fields和 *PointFields、日期字段和枚举字段,此值为true的字段要求此字段 multiValued=false,并且 (required=true或设置了default的值).
multiValued false 是否有多个值。 比如存储一个用户的好友id(多个),商品的图片(多个,大图和小图),通过使用solr查询要看出返回给客户端是数组:
omitNorms 见下面的说明
termVectors false 设置为true,使More Like This特性生效,会极大的增加索引文件的大小。
termPositions false 通常用于提高高亮搜索结果这一功能的性能。设置为true,会增加索引文件的大小。
termOffsets false 通常用于提高高亮搜索结果这一功能的性能。设置为true,会增加索引文件的大小。
termPayloads false 通常用于提高高亮搜索结果这一功能的性能。设置为true,会增加索引文件的大小。
required false 如果设置为true,则索引时,如果此字段值为null,则会报错。
default 此字段的默认值。通常用于记录索引生成的当前时间
sortMissingFirstsortMissingLast false 需要对搜索结果根据某个字段排序时,如果某条记录的此字段值为空,则该记录是排在搜索结果的最前/最后
omitTermFreqAndPositions 对所有不是文本类型的字段,默认为TRUE
omitPositions 与omitTermFreqAndPositions相似,只是仅忽略位置信息
useDocValuesAsStored 当docValues=true时,设置此值为TRUE,则如果返回的字段列表使用了通配符,即使此字段设置了stored=false,此字段还是会出现在返回的结果里,
large false 设置为TRUE时,需要设置stored=true和multiValued=false, 表示此字段是大字段,会被懒加载。通常用于此字段的内容可能比较大,不需要载入内存

fieldType

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymGraphFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        <filter class="solr.FlattenGraphFilterFactory"/>
        -->
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
 </fieldType>

FieldType子结点包括:name, class, positionIncrementGap等一些参数:

  1. name:是这个FieldType的名称
  2. class:是Solr提供的包solr.TextField,solr.TextField允许用户通过分析器来定制索引和查询,分析器包括一个分词器(tokenizer)和多个过滤器(filter)
  3. positionIncrementGap:可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误,此值相当于Lucene的短语查询设置slop值,根据经验设置为100。

  在FieldType定义的时候最重要的就是定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括

  1. 分词和过滤索引分析器中:使用solr.StandardTokenizerFactory标准分词器,solr.StopFilterFactory停用词过滤器,solr.LowerCaseFilterFactory小写过滤器。

2 .搜索分析器中:使用solr.StandardTokenizerFactory标准分词器,solr.StopFilterFactory停用词过滤器,这里还用到了solr.SynonymFilterFactory同义词过滤器。

UniqueKey

Solr中默认定义唯一主键key为id域,Solr在删除、更新索引时使用id域进行判断,也可以自定义唯一主键。

<uniqueKey>id</uniqueKey>

copyField  

copyField复制域,可以将多个Field复制到一个Field中,以便进行统一的检索:  

<copyField source="title" dest="text"/>
<copyField source="content" dest="text"/>

比如,输入关键字搜索title标题内容content,定义title、content、text的域,根据关键字只搜索text域的内容就相当于搜索title和content,将title和content复制到text中。

dynamicField

动态字段就是不用指定具体的名称,只要定义字段名称的规则,例如定义一个 dynamicField,name为*_i,定义它的typetext,那么在使用这个字段的时候,任何以_i结尾的字段都被认为是符合这个定义的,例如:name_igender_ischool_i等。

好了managed-schema文件的属性我介绍到这里,下面开始正文。

首先我们找到<uniqueKey>id</uniqueKey>这行代码,把它改为下图格式

uniqueKey

然后我们配置field,field是我们添加索引用到的,你的mongodb中每一个字段都要在这个文件里面配置一个field

我们先添加一个<fields></fiellds>,以后所有的field都要添加到这里,把上面的_id_version_剪切到<fields></fiellds>

field

<fields>
        <field name="_id" type="string" indexed="true" stored="true" />
        <!-- docValues are enabled by default for long type so we don't need to index the version field  -->
        <field name="_version_" type="plong" indexed="false" stored="false"/>

        <!-- If you don't use child/nested documents, then you should remove the next two fields:  -->
        <!-- for nested documents (minimal; points to root document) -->

        <!-- for nested documents (relationship tracking) -->
        <field name="_ts" type="plong" indexed="true" stored="true" />
        <field name="ns" type="string" indexed="true" stored="true"/>


    </fields>

我们添加一个测试字段name

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

配置完成,每当修改完managed-schema文件我们都要重启solr

命令solr restart -port 8983

同步数据

到了本篇最重要的一步也是最简单的一步,同步数据,把我们mongodb里的数据同步到solr中

打开cmd执行

mongo-connector -m localhost:27017 -t http://localhost:8983/solr/corename -d solr_doc_manager

把命令行中的corename替换成你自己的core,出现以下画面同步就算成功了,如果光标跳出来了没有继续Logging说明同步失败,同步失败的原因有很多,可以把画面显示路径下的mongo-connector.logoplog.timestamp删除再同步,还失败的话你就回看我的步骤,解决不了的可以在下方留言我。

同步成功

当Logging没有跳出来的时候,证明一直在同步,这时我们增删改mongodb的数据都会同步到solr中,要想在solr里显示,每次有数据变动我们都需要点reload把core的索引更新

reloadquery

可以看到我们的数据已经都同步到了solr中,至此Solr学习(二)同步MongoDB数据也结束了,还剩最后一篇ssm项目整合solr ,我也会抽时间写出来,部署中如果有任何问题都可以在下方留言我会及时解决。
抱歉,隐藏内容 评论 后刷新可见