前言
对于刚接触solr的新手,在使用上多多少少会遇上一些问题,就算你按照别人的配置来做,也难免会出现这种情况,所以将我在使用过程中遇到的坑记录一下。
磁盘不够
在建索引的时候,需要在core.properties
配置好索引存放的路径。如下图我的路径配置为/home/tdlab/solrData/18_4_3core_data。
1 | #Written by CorePropertiesLocator |
当你开始建立索引的时候,在dataimport的界面可以看到索引的具体情况。Fetched: 4
表示总共取了多少的数据了,Processed: 4
表示的处理了多少条数据。一般情况下这两个值是相等的。即取的每一条数据,都被成功索引了。
但当我在为一份40G的数据建索引的时候,就出现了下面的情况,Fetched
和Processed
的值在处理了大概10个G数据的时候,两个值就不一样了,processed
已经不在增加了,打开界面中的Logging
可以看到以下错误,报错的原因是磁盘不够了。
当时看到这个问题的时候,我想的是实验室solr服务器的磁盘怎么可能因为40个g就不够了呢?后来一查才知道,原来Linux
的磁盘分区管理导致的。利用df -lh命令查看磁盘使用情况。1
2
3
4
5
6
7
8
9tdlab@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,降低内存的消耗。