弹性搜索在方面中按空间分割

时间:2012-09-11 14:13:26

标签: lucene elasticsearch

我正在尝试对包含多个单词的字段执行简单的构面请求(例如:'Name1 Name2',有时内部带点和逗号),但我得到的是......

 "terms" : [{
    "term" : "Name1",
    "count" : 15
},
{
    "term" : "Name2",
    "count" : 15
}]

所以我的字段值按空格分割,然后运行构面请求...

查询示例:

curl -XGET http://my_server:9200/idx_occurrence/Occurrence/_search?pretty=true -d '{
  "query": {
    "query_string": {
      "fields": [
        "dataset"
      ],
      "query": "2",
      "default_operator": "AND"
    }
  },
  "facets": {
    "test": {
      "terms": {
        "field": [
          "speciesName"
        ],
        "size": 50000
      }
    }
  }
}'

2 个答案:

答案 0 :(得分:5)

不应分析您的字段,或至少不进行标记。如果要对字段编制索引而不对其进行标记,则需要更新映射,然后重新编制索引。

答案 1 :(得分:4)

首先,javanna从实际角度提供了一个非常好的答案。但是,为了完整起见,我想提一下,在某些情况下,有一种方法可以在不重新索引数据的情况下完成。

如果存储speciesName字段且您的查询产生的结果数量相对较少,则可以使用script_field检索存储的字段值:

curl -XGET http://my_server:9200/idx_occurrence/Occurrence/_search?pretty=true -d '{
  "query": {
    "query_string": {
      "fields": ["dataset"],
      "query": "2",
      "default_operator": "AND"
    }
  },
  "facets": {
    "test": {
      "terms": {
        "script_field": "_fields['\''speciesName'\''].value",
        "size": 50000
      }
    }
  }
}
'

作为此查询的结果,elasticsearch将为结果集中的每条记录检索speciesName字段,它将根据这些值构建构面。毋庸置疑,如果您的结果集包含数百万条记录,则此查询的执行可能会缓慢。

同样,如果未存储该字段,但存储了记录源,则可以使用script_field facet从源中检索字段值:

......
"script_field": "_source['\''speciesName'\'']",
......

同样,将检索并解析结果列表中每条记录的来源,因此您可能需要一些耐心才能在大量记录上运行此查询。