【问题标题】:How to setup a field mapping for ElasticSearch that allows both exact and full text searching?如何为 ElasticSearch 设置允许精确和全文搜索的字段映射?
【发布时间】:2014-09-24 00:19:05
【问题描述】:

这是我的问题:

我有一个名为 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。

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

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

【问题讨论】:

    标签: indexing lucene elasticsearch


    【解决方案1】:

    是的,您可以使用 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

    但是,您需要花一些时间来考虑要如何进行搜索。特别是,如果零件编号混合了字母、数字和标点符号或特殊字符,您可能需要发挥创意来调整查询和匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      相关资源
      最近更新 更多