版本es6.4,分词器IK
问题描述:
现在的需求是在搜索比如‘水果’的时候能查询出‘水果’,‘苹果’,‘香蕉’,‘西瓜’等等,而在单独搜索‘苹果’的时候不会出现‘水果’。
”水果=>苹果,香蕉,西瓜“
做法及结果
但是用英文,并且在建立索引阶段不加mapping,而在查询阶段加入analyzer时是有效果的。如下
此时的
得到的结果是没有分析器的,如图
但是用了中文分词器之后,如果不在建立索引的时候加入mapping,
GET /fruit/_mapping/products是和上面一样,没有分析器。而且在查询的时候加入分析器是没用的。。。
"analyzer": "my_synonyms"这句话没有用,而且查询没结果。
这个文档https://www.elastic.co/guide/c ... .html
最后的类型扩展中提到的就是上面的做法,在索引时不使用类型扩展,而在查询时使用,但是用了中文分词之后没有用啊。。
所以请教给位大神同义词偏序这个怎么做呢
问题描述:
现在的需求是在搜索比如‘水果’的时候能查询出‘水果’,‘苹果’,‘香蕉’,‘西瓜’等等,而在单独搜索‘苹果’的时候不会出现‘水果’。
”水果=>苹果,香蕉,西瓜“
做法及结果
PUT /fruit
{
"settings": {
"index": {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms": [
"水果=>苹果,香蕉,西瓜"
]
}
},
"analyzer": {
"my_synonyms": {
"tokenizer": "ik_smart",
"filter": [
"lowercase",
"my_synonym_filter"
]
}
}
}
}
},
"mappings": {
"products": {
"properties": {
"price": {
"type": "long"
},
"productID": {
"type": "text",
"analyzer": "my_synonyms"
}
}
}
}
}
POST /fruit/products/_bulk
{"index": {"_id": 1}}
{ "price" : 10, "productID" : "水果" }
{ "index": { "_id": 2 }}
{ "price" : 20, "productID" : "苹果" }
{ "index": { "_id": 3 }}
{ "price" : 30, "productID" : "香蕉" }
{ "index": { "_id": 4 }}
{ "price" : 30, "productID" : "西瓜" }
GET /fruit/products/_search
{
"query": {
"match": {
"productID": {
"analyzer": "my_synonyms",
"query": "西瓜"
}
}
}
}
这样查询出来的结果有西瓜和水果。不满足需求。但是用英文,并且在建立索引阶段不加mapping,而在查询阶段加入analyzer时是有效果的。如下
PUT /fruit1
{
"settings": {
"index": {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms": [
"fruit=>apple,banana,watermelon"
]
}
},
"analyzer": {
"my_synonyms": {
"tokenizer": "ik_smart",
"filter": [
"lowercase",
"my_synonym_filter"
]
}
}
}
}
}
}
POST /fruit1/products/_bulk
{"index": {"_id": 1}}
{ "price" : 10, "productID" : "fruit" }
{ "index": { "_id": 2 }}
{ "price" : 20, "productID" : "apple" }
{ "index": { "_id": 3 }}
{ "price" : 30, "productID" : "banana" }
{ "index": { "_id": 4 }}
{ "price" : 30, "productID" : "watermelon" }
GET /fruit1/products/_search
{
"query": {
"match": {
"productID": {
"analyzer": "my_synonyms",
"query": "watermelon"
}
}
}
}
此时的
GET /fruit1/_mapping/products
得到的结果是没有分析器的,如图
但是用了中文分词器之后,如果不在建立索引的时候加入mapping,
GET /fruit/_mapping/products是和上面一样,没有分析器。而且在查询的时候加入分析器是没用的。。。
"analyzer": "my_synonyms"这句话没有用,而且查询没结果。
这个文档https://www.elastic.co/guide/c ... .html
最后的类型扩展中提到的就是上面的做法,在索引时不使用类型扩展,而在查询时使用,但是用了中文分词之后没有用啊。。
所以请教给位大神同义词偏序这个怎么做呢
2 个回复
zz_hello
赞同来自: zyb1994111 、XZ
rochy - rochy_he
赞同来自:
请仔细理解业务的需求和实现的效果