这可以通过使用shingle过滤器并使output_unigrams 为 false来完成(它将阻止生成单个令牌)。像这样创建索引
PUT shingle_index
{
"settings": {
"analysis": {
"analyzer": {
"shingle_analyzer": {
"tokenizer": "standard",
"filter": [
"shingle_filter",
"lowercase"
]
}
},
"filter": {
"shingle_filter":{
"type" : "shingle",
"max_shingle_size" : 2,
"min_shingle_size" : 2,
"output_unigrams" : false,
"output_unigrams_if_no_shingles" : true
}
}
}
},
"mappings": {
"mytype":{
"properties": {
"text" : {
"type": "string",
"analyzer": "shingle_analyzer"
}
}
}
}
}
索引一些示例文档。
POST /shingle_index/mytype/_bulk
{"index":{"_id":5}}
{"text":"token1 token4"}
{"index":{"_id":3}}
{"text":"token2 token3"}
{"index":{"_id":2}}
{"text":"token4 token5"}
然后简单的匹配查询会给你想要的结果。
GET shingle_index/_search
{
"query": {
"match": {
"text": "token1 token2 token3 token4"
}
}
}