一尘不染

为词组搜索和部分匹配建立索引的字段

elasticsearch

我在对象上创建索引,并希望既可以进行完整短语搜索也可以进行部分匹配。该类型称为“发送方”,简化的索引创建如下所示:

{
   "deponent": {
      "properties": {         
         "name": {
            "type": "multi_field",
            "fields": {
               "name": {
                  "type": "string"
               },
               "full": {
                  "type": "string",
                  "index": "not_analyzed",
                  "omit_norms": true,
                  "index_options": "docs",
                  "include_in_all": false
               }
            }
         }
      }
   }
}

这样做的目的是对“名称”字段中的值建立索引两次:一次是不拆分字段中的各个单词(name.full),一次是拆分单词(name.name)。

我有一个已建立索引的文档,其名称字段设置为“ Danny Watson博士”。我希望在执行术语查询(根据文档未分析其查询字符串)时发生以下行为:

  1. 使用“ Danny Watson博士” 搜索 name.full时 返回记录
  2. 使用“ Watson” 搜索 name.full时不应 返回该记录
  3. 使用“ Danny Watson博士” 搜索 name.name时不应 返回该记录
  4. 使用“ Watson” 搜索 name.name时 返回记录

对以上四点的查询:

1-按预期工作(返回记录)

{
    "query" : {
        "term": {
           "name.full": {
              "value": "Dr. Danny Watson"
           }
        }
    }   
}

2-按预期方式工作(不返回记录)

{
    "query" : {
        "term": {
           "name.full": {
              "value": "Watson"
           }
        }
    }   
}

3-正常工作(不返回记录)

{
    "query" : {
        "term": {
           "name.name": {
              "value": "Dr. Danny Watson"
           }
        }
    }   
}

4- 不能 按预期工作-记录未返回

{
    "query" : {
        "term": {
           "name.name": {
              "value": "Watson"
           }
        }
    }   
}

所以看来我对某些事情的理解是有缺陷的。我想念什么?


阅读 342

收藏
2020-06-22

共1个答案

一尘不染

您无需调用字段“ name.name”。具有原始名称的多字段用作默认值,因此您应该仅使用“名称”。
同样,最好确保索引和搜索分析器的顺序正确(例如,将索引词和搜索词都更改为小写)。

2020-06-22