我是弹性搜索的新手,遇到以下情况的麻烦:
我需要类似于带状疱疹过滤器的东西,它会从查询中创建以下标记:
[" token1 token2"," token2 token3"," token3 token4"," token4 token5"]
并且将通过这些令牌完全匹配,因此令牌"令牌2令牌3"和#34; token4 token5"将匹配文件
提前致谢!
答案 0 :(得分:2)
这可以通过使用shingle filter并使 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"
}
}
}