为短语搜索和部分匹配索引字段

时间:2013-10-21 14:10:48

标签: elasticsearch

我正在创建对象的索引,并且希望能够执行完整短语搜索以及部分匹配。该类型称为“deponent”,简化的索引创建如下所示:

{
   "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)

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

  1. 使用“Danny Watson博士”搜索 name.full 时,记录 返回
  2. 使用“Watson”搜索 name.full 时,记录不应返回
  3. 使用“Danny Watson博士”搜索 name.name 时,记录不应返回
  4. 使用“Watson”搜索 name.name 时,记录返回
  5. 上述四点的查询:

    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 - NOT 按预期工作 - 不返回记录

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

    所以我对某事的理解似乎有缺陷。我错过了什么?

1 个答案:

答案 0 :(得分:1)

您无需调用“name.name”字段。具有原始名称的多字段用作默认值,因此您应该只使用“名称” 此外,确保索引和搜索分析器按顺序排列总是好的(例如,您的索引术语和搜索术语都会更改为小写)。