简单搜索及分词
ik分词器中有两个分词模式。
1个粗粒度,1个细粒度
ik_max_word是细粒度。例如搜索“中华人民共和国人民大会堂”将被拆为:中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂等。
ik_smart是粗粒度。例如搜索“中华人民共和国人民大会堂”将被拆为:拆分为中华人民共和国、人民大会堂。
常用类型
字符串:
text:会分词
keyword:不会分词
数值型:
整型: byte,short,integer,long
浮点型: float, half_float, scaled_float,double
日期类型
date
范围型
integer_range, long_range, float_range,double_range,date_range
具体:https://www.cnblogs.com/chy18883701161/p/12723658.html
字段映射字段属性及分词搜索说明
我们要实现分词搜索,就在建立索引时,指定下映射。
$esSer = new \app\ser\EsServer('test');
$esSer->delIndex();
$param = [
'id' => [
'type' => 'integer'
],
'title' => [
'type' => 'text',
'analyzer' => 'ik_max_word'
]
];
$esSer->createMapping($param);
$arr = [
['id' => 1, 'title' => '法国进口高端红酒'],
['id' => 2, 'title' => '高端进口美食'],
['id' => 3, 'title' => '美国进口特价红酒'],
['id' => 4, 'title' => '泰国口红'],
];
$esSer->putDocs($arr);
我们把之前的索引删了,然后创建个映射关系。
并向里面填充点数据。
这时候,我们搜索“进口红酒”
$esSer = new \app\ser\EsServer('test');
$query = [
'query' => [
'match' => [
'title' => '进口红酒',
]
]
];
$esSer->search($query);
会把口红给筛进来
,OK,我们把前面的analyzer的值由’ik_max_word’改成 ‘ik_smart’
再搜索“进口红酒”,这时候我们发现,进口口红已经没了。
OK,当然,如果我们创建索引时,忘记填写analyzer这个。或者填写的不是我们要的咋整?
我们可以再指定search_analyzer 搜索分词。
例如上面,我们analyzer已经被我们修改为:‘ik_smart’了
那么搜索出来,没有口红怎么办?
这时候,我们只改search_analyzer,但是analyzer不能修改。所以我么就这么整
$esSer = new \app\ser\EsServer('test');
$param = [
'title' => [
'type' => 'text',
'analyzer' => $esSer->getMapping()['test']['mappings']['properties']['title']['analyzer'],
'search_analyzer' => 'ik_max_word',
]
];
$esSer->createMapping($param);
analyzer必须得填写,而且还不能修改(不知道是不是我没研究透,还是咋滴,但是我这么写实可以)
这时候我们analyzer就取原来该索引的映射值。
然后修改掉search_analyzer这个词。
这时候再搜索“进口红酒”,就变成了 ik_max_word 模式去搜索
analyzer与search_analyzer区别,请参考:http://blog.joylau.cn/2019/01/24/Elasticsearch-Analyzer/