如何为ElasticSearch设置字段映射,允许精确和全文搜索?

时间:2014-07-31 21:34:28

标签: indexing lucene elasticsearch

这是我的问题:

我有一个名为product_id的字段,其格式类似于:

A+B-12321412

如果我使用标准文本分析器,它会将其拆分为令牌,如下所示:

/_analyze/?analyzer=standard&pretty=true" -d '                                        
A+B-1232412
'
{
  "tokens" : [ {
    "token" : "a",
    "start_offset" : 1,
    "end_offset" : 2,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "b",
    "start_offset" : 3,
    "end_offset" : 4,
    "type" : "<ALPHANUM>",
    "position" : 2
  }, {
    "token" : "1232412",
    "start_offset" : 5,
    "end_offset" : 12,
    "type" : "<NUM>",
    "position" : 3
  } ]
}

理想情况下,我希望有时会搜索确切的产品ID,有时会使用子字符串,或者只是查询部分产品ID。

我对映射和分析器的理解是我每个字段只能指定一个分析器。

有没有办法将字段存储为已分析和完全匹配?

1 个答案:

答案 0 :(得分:3)

是的,您可以使用fields参数。在你的情况下:

"product_id": {
    "type": "string",
    "fields": {
        "raw":   { "type": "string", "index": "not_analyzed" }
    }
}

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/_multi_fields.html

这允许您使用两个不同的定义将相同的数据索引两次。在这种情况下,它将通过默认分析器和not_analyzed进行索引,这只会获取完全匹配。这对于排序返回结果也很有用:

http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/multi-fields.html

但是,您需要花一些时间考虑如何搜索。特别是,如果给定的部分编号混合了字母,数字和标点符号或特殊字符,您可能需要具有创造性来调整查询和匹配。