大背景:
本章节将记录搜索项目里碰到的一些问题,这些问题一般刚入门时根本不会注意到,但是这些问题会让你付出惨痛的代价。
一、搜索的字段里包含大写字母
背景:2015-05-27,做了一个ERP订单搜索的需求,索引建完,做了一下搜索测试,通过ID搜索(id=1)OK,通过状态搜索(status=1)OK,通过orderSn搜索(orderSn=B50512232123213)FAILED,查了一下索引,明明是有这个orderSn的,为什么查不出来?
原因:elasticsearch默认的分词器在建索引时自动把大写字母变成了小写,在配置文件里指定WhitespaceAnalyzerProvider,会以空白字符分词,同时不会自动把大写转为小写。
解决:在elasticsearch的配置文件elasticsearch.yml 最后加入下面配置
script.disable_dynamic:
false
index:
analysis:
analyzer:
default
:
type: org.elasticsearch.index.analysis.WhitespaceAnalyzerProvider
tokenizer: whitespace
|
总结:这个问题,刚入门真的真的很难发现,我是查了两个小时后,问Rich解决的。
二、时间字段建索引时的特殊处理
背景:需要对时间做范围搜索,必须先对这个字段进行特殊处理,如果不做特殊处理,这个范围查询查出来的结果不能保证是正确的,尽管他有时候是正确的。这个是Rich直接告诉我的,所以连出错的机会都没有,节省下来的时间用来记录这些问题。
原因:暂不知道什么原因
解决:把时间建索引的时候,需要修改一下这个字段的mapping,在建索引前添加以下代码
//更新mapping,有日期字段时需要执行
XContentBuilder builder =
null
;
try
{
builder = XContentFactory.jsonBuilder()
.startObject()
.startObject(typeName)
.field(
"dynamic_date_formats"
,
"yyyy-MM-dd HH:mm:ss"
)
.endObject()
.endObject();
}
catch
(IOException e) {
e.printStackTrace();
}
ElasticFactory.createMapping(indexName, typeName, builder);
|
总结:感谢CCTV,在我还没有出现过这个错误的时候,就已经把这个问题解决了。