Elasticsearch在多个字段中搜索值

时间:2014-02-13 16:47:52

标签: elasticsearch

我的目的是在多个字段中搜索一个值,并返回这些值的计数和不同的值。

要做到这一点,我意识到我必须使用方面。

这是数据库架构:

index:   
    analysis:   
        analyzer:
            custom_search_analyzer:
                type: custom
                tokenizer: standard
                filter   : [standard, snowball, lowercase, asciifolding]
            custom_index_analyzer:
                type: custom
                tokenizer: standard
                filter   : [standard, snowball, lowercase, asciifolding, custom_filter]
        filter:
            custom_filter:
                type: edgeNGram
                side: front
                min_gram: 1
                max_gram: 20

{
 "structure": {
   "properties": {
     "name": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"},
     "locality": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"},
     "province": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"},
     "region": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"}
   }
 }
}

这是我尝试使用的查询:

{
"query": {
    "bool": {
      "should": [
        {
          "match": {
            "locality": "bolo"
          }
        },
        {
          "match": {
            "region": "bolo"
          }
        },
        {
          "match": {
            "name": "bolo"
          }
        }
      ]
    }
  },
  "facets": {
    "region": {
      "query": {
        "term": {
          "region": "bolo"
        }
      }
    },
    "locality": {
      "query": {
        "term": {
          "locality": "bolo"
        }
      }
    },
    "name": {
      "query": {
        "term": {
          "name": "bolo"
        }
      }
    }
  }
}

在我所做的所有测试中,这是最接近我想要的结果的查询,但是,并没有告诉我不同​​字段的计数,我发现它计算总字段。

例如,上面的查询返回以下结果:

facets: {
       region: {
       _type: query
       count: 0
    }
    locality: {
       _type: query
       count: 2
    }
    name: {
       _type: query
       count: 0
    }
}

我想得到这样的结果(不是那么明显写得对,但确实理解我的需要):

facets: {
    ....
    locality: {
       _type: query
       "terms": [
           {"term": "Bologna", "count": 1},
           {"term": "Bolognano", "count": 1}
       ]

    }

我该怎么办?

我已经尝试在facets中使用“terms”而不是“query”,并在研究领域中放入“index:not_analyzed”,但只有在我尝试确切的范围时才会返回,而不是它的一部分!< / p>

1 个答案:

答案 0 :(得分:0)

这可以使用值计数聚合来完成。 在值计数聚合中,它为您提供了唯一术语的数量。 术语聚合为您提供唯一的术语及其文档数。

我相信您正在寻找价值计数汇总 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-valuecount-aggregation.html