我正在尝试使用elasticsearch的facets功能制作单词和短语的tagcloud。
我的映射:
curl -XPOST http://localhost:9200/myIndex/ -d '{
...
"analysis":{
"filter":{
"myCustomShingle":{
"type":"shingle",
"max_shingle_size":3,
"output_unigrams":true
}
},
"analyzer":{ //making a custom analyzer
"myAnalyzer":{
"type":"custom",
"tokenizer":"standard",
"filter":[
"lowercase",
"myCustomShingle",
"stop"
]
}
}
}
...
},
"mappings":{
...
"description":{ //the field to be analyzed for making the tag cloud
"type":"string",
"analyzer":"myAnalyzer",
"null_value" : "null"
},
...
}
查询生成构面:
curl -X POST "http://localhost:9200/myIndex/myType/_search?&pretty=true" -d '
{
"size":"0",
"query": {
match_all:{}
},
"facets": {
"blah": {
"terms": {
"fields" : ["description"],
"exclude" : [ 'evil' ], //remove facets that contain these words
"size": "50"
}
}
}
}
我的问题是,当我在“facets”的“exclude”选项中插入一个单词“evil”时,它会成功删除包含与“evil”匹配的单词(或单个shingles)的facet。但它并没有删除2/3字的带状疱疹,“生化危机”,“邪恶的电脑”,“我的邪恶的猫”。如何删除包含“排除字词”的短语的方面?
答案 0 :(得分:0)
您想要实现的目标尚不完全清楚。您通常不会在分析的字段上进行构面。也许你可以解释为什么你要制作带状疱疹,以便我们能够以更好的方式帮助你实现你想要的东西。
使用exclude facet参数,您可以排除某些特定条目,但evil
与resident evil
不同。如果要排除它,则需要指定它。构面基于索引术语构成,resident evil
实际上是索引中的单个术语,与术语evil
不同。
鉴于您已经为索引和分面做出了选择,有一种方法可以实现您想要的目标。 Elasticsearch有一个非常强大的脚本模块。您可以使用脚本来决定是否应将每个条目包含在构面中,如下所示:
{
"query": {
"match_all" : {}
},
"facets": {
"tags": {
"terms": {
"field" : "tags",
"script" : "term.contains('evil') ? true : false"
}
}
}
}