1. 上下文context suggester
completion suggester会考虑索引中的所有文档,但有些情况下我们希望在复合一定的过滤条件的范围内获得suggest。例如,您想建议由某些艺术家的歌曲标题,或者您要根据其类型来提升某些歌曲标题的权重。
为了实现过滤或增强suggest,您可以在配置completion字段的mapping时添加上context mappings。可以为completion字段定义多个上context mappings。每个context mappings都有唯一的name和type。有两种type:category 和 geo。上下文映射在字段映射中的contexts参数下配置。
使用样例
PUT place
{
"mappings": {
"properties" : {
"suggest" : {
"type" : "completion",
"contexts": [
{
"name": "place_type", # 定义context的name
"type": "category" # 定义context的类型,在index的时候必须提供这个context的内容
},
{
"name": "location",
"type": "geo",
"precision": 4
}
]
}
}
}
}
PUT place_path_category
{
"mappings": {
"properties" : {
"suggest" : {
"type" : "completion",
"contexts": [
{
"name": "place_type",
"type": "category",
"path": "cat" # 定义了place_type context的内容从cat field读取, 在index的时候不用再提供这个context的内容了,只需要提供cat的内容
},
{
"name": "location",
"type": "geo",
"precision": 4,
"path": "loc" # 定义了location context对应的内容从loc field读取
}
]
},
"loc": {
"type": "geo_point"
}
}
}
}
2. category index 操作
PUT place/_doc/1
{
"suggest": {
"input": ["timmy's", "starbucks", "dunkin donuts"],
"contexts": {
"place_type": ["cafe", "food"]
}
}
}
PUT place_path_category/_doc/1
{
"suggest": ["timmy's", "starbucks", "dunkin donuts"],
"cat": ["cafe", "food"]
}
3. category 查找
POST place/_search?pretty
{
"suggest": {
"place_suggestion" : {
"prefix" : "tim",
"completion" : {
"field" : "suggest",
"size": 10,
"contexts": {
"place_type": [ "cafe", "restaurants" ]
}
}
}
}
}
POST place/_search?pretty
{
"suggest": {
"place_suggestion" : {
"prefix" : "tim",
"completion" : {
"field" : "suggest",
"size": 10,
"contexts": {
"place_type": [
{ "context" : "cafe" },
{ "context" : "restaurants", "boost": 2 }
]
}
}
}
}
}
4. geo index
geo多了一个属性交precision 定义了精度
PUT place/_doc/1
{
"suggest": {
"input": "timmy's",
"contexts": {
"location": [
{
"lat": 43.6624803,
"lon": -79.3863353
},
{
"lat": 43.6624718,
"lon": -79.3873227
}
]
}
}
}
5. geo search
POST place/_search
{
"suggest": {
"place_suggestion" : {
"prefix" : "tim",
"completion" : {
"field" : "suggest",
"size": 10,
"contexts": {
"location": {
"lat": 43.662,
"lon": -79.380
}
}
}
}
}
}
POST place/_search?pretty
{
"suggest": {
"place_suggestion" : {
"prefix" : "tim",
"completion" : {
"field" : "suggest",
"size": 10,
"contexts": {
"location": [
{
"lat": 43.6624803,
"lon": -79.3863353,
"precision": 2
},
{
"context": {
"lat": 43.6624803,
"lon": -79.3863353
},
"boost": 2
}
]
}
}
}
}
}