无法使用“facets”查询中提供的“排除”字词选项过滤掉n个(n - 克)构面

时间:2012-10-08 09:48:12

标签: lucene elasticsearch faceted-search tag-cloud

我正在尝试使用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字的带状疱疹,“生化危机”,“邪恶的电脑”,“我的邪恶的猫”。如何删除包含“排除字词”的短语的方面?

1 个答案:

答案 0 :(得分:0)

您想要实现的目标尚不完全清楚。您通常不会在分析的字段上进行构面。也许你可以解释为什么你要制作带状疱疹,以便我们能够以更好的方式帮助你实现你想要的东西。

使用exclude facet参数,您可以排除某些特定条目,但evilresident evil不同。如果要排除它,则需要指定它。构面基于索引术语构成,resident evil实际上是索引中的单个术语,与术语evil不同。

鉴于您已经为索引和分面做出了选择,有一种方法可以实现您想要的目标。 Elasticsearch有一个非常强大的脚本模块。您可以使用脚本来决定是否应将每个条目包含在构面中,如下所示:

{
  "query": {
    "match_all" : {}
  },
  "facets": {
    "tags": {
      "terms": {
        "field" : "tags",
        "script" : "term.contains('evil') ? true : false"
      }
    }
  }
}