Solr路上的坑

前言

对于刚接触solr的新手,在使用上多多少少会遇上一些问题,就算你按照别人的配置来做,也难免会出现这种情况,所以将我在使用过程中遇到的坑记录一下。

磁盘不够

在建索引的时候,需要在core.properties配置好索引存放的路径。如下图我的路径配置为/home/tdlab/solrData/18_4_3core_data。

1
2
3
4
5
6
#Written by CorePropertiesLocator
#Tue May 08 02:13:05 UTC 2018
config=solrconfig.xml
name=18_5_8core
schema=schema.xml
dataDir=/dev/tdlab/solrData/18_4_3core_data

当你开始建立索引的时候,在dataimport的界面可以看到索引的具体情况。Fetched: 4表示总共取了多少的数据了,Processed: 4表示的处理了多少条数据。一般情况下这两个值是相等的。即取的每一条数据,都被成功索引了。

你想输入的替代文字

但当我在为一份40G的数据建索引的时候,就出现了下面的情况,FetchedProcessed的值在处理了大概10个G数据的时候,两个值就不一样了,processed已经不在增加了,打开界面中的Logging可以看到以下错误,报错的原因是磁盘不够了。

你想输入的替代文字

当时看到这个问题的时候,我想的是实验室solr服务器的磁盘怎么可能因为40个g就不够了呢?后来一查才知道,原来Linux的磁盘分区管理导致的。利用df -lh命令查看磁盘使用情况。

1
2
3
4
5
6
7
8
9
tdlab@tdlab-virtual-machine:~/lucene-solr/solr/server/solr/18_5_8core$ df -lh
Filesystem Size Used Avail Use% Mounted on
udev 18G 0 18G 0% /dev
tmpfs 3.6G 34M 3.6G 1% /run
/dev/sda1 260G 70G 178G 29% /
tmpfs 18G 208K 18G 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 18G 0 18G 0% /sys/fs/cgroup
tmpfs 3.6G 112K 3.6G 1% /run/user/1000

因为我们的solr所以的配置目录是/dev/tdlab/solrData/18_4_3core_data,目录刚好命中/dev,而根据上面显示,/dev只能提供18个g的大小了,所以索引在建到一半就会出现磁盘不够的现象,更改索引文件存储路径即可。

改成/home/tdlab/solrData/18_4_3core_data,根据磁盘的分区情况,是命中了/根目录,所以磁盘不够问题就解决了。

内存不足

上面提到了磁盘不够的情况,下面再分析一下内存不够导致索引失败的一些坑。

第一个点是可以直接避免的,在创建一个核心的时候,系统会自动帮我们生成一个managed-schema这个配置文件,在这个文件我们通常需要配置要索引的字段,字段的词分析器的配置等。下面来看一下这个配置文件中默认一些选项。
你想输入的替代文字

可以看到有这么一个配置,这个配置是会把所有的字段都索引,这会导致我们的索引文件开销变大很多,而在建索引文件的时候,是需要往内存中写入的,所以这个配置我们直接删除就好。

<field name="_text_" type="string" indexed="true" stored="false" multiValued="true"/>
<copyField source="*" dest="_text_"/>

第二个点是在配置默认字段的时候,如果字段有多个需要注意。下面的配置文件中,原本的title和content类型是设置为string,并且是不indexed是为false的,而在defaultField的时候,我们将字段的类型设置为text_hanlp,并且将indexed设置为true

你想输入的替代文字

从后面的搜索效果来看,可以看出,defaultField的本质其实是将所有的copyField合并成一个新的字段,然后对这个字段建立索引,所以在stored的设置上,就要设置为false,不然返回的数据,其实是title+'\n'+content的一个结果,没有意义。

而且一个重要的点是,如果你的你在查询的时候不会用到q=title:str,而是直接使用默认字段,而刚好默认字段是包含了title的,并且默认字段是索引了的,那么完全可以把title的indexed配置设置为false,降低内存的消耗。