模糊名称匹配,使用zentity.io

时间:2018-12-07 17:06:14

标签: elasticsearch

使用zentity.io插件进行实体解析,我试图设计一个实体模型,该模型允许我使用单个搜索字符串(可能是全名)来查找实体(在这种情况下为人)。

POST _zentity/models/person
{
"attributes": {
  "first_name": {
    "type": "string"
  },
   "middle_name": {
    "type": "string"
  },
   "last_name": {
    "type": "string"
  }
},
"resolvers": {
  "full_name": {
    "attributes" : ["first_name", "middle_name", "last_name"]
  },
  "first_and_last": {
    "attributes" : ["first_name", "last_name"]
  },
  "middle_and_last" : {
    "attributes" : ["middle_name", "last_name"]
  }
},
"matchers": {
  "exact": {
    "clause": {
      "term": {
        "{{ field }}": "{{ value }}"
      }
    }
  },
  "fuzzy": {
    "clause": {
      "match": {
        "{{ field }}": {
          "query": "{{ value }}",
          "fuzziness": 1
        }
      }
    }
  }
},
"indices": {
  "my-index": {
    "fields": {
      "firstName": {
        "attribute": "first_name",
        "matcher": "fuzzy"
      },
      "middleName": {
        "attribute": "middle_name",
        "matcher": "fuzzy"
      },
      "surname": {
        "attribute": "last_name",
        "matcher": "fuzzy"
      }
    }
  }
}

如您所见,我定义了实体解析模型的属性(即first_name,middle_name和last_name),定义了属性的匹配器(在这种情况下,仅使用模糊匹配器),并定义了几个解析器来解释哪种组合匹配属性的结果产生一个匹配实体。

例如,我将拥有一个具有如下属性的实体:

{
  "first_name": "Edgar",
  "middle_name": "Allan",
  "last_name": "Poe"
}

根据我的 middle_and_last 解析器,使用以下查询进行搜索将导致匹配。

POST _zentity/resolution/person?pretty
{
  "attributes": {
    "middle_name": ["Allan"],
    "last_name": ["Poe"]
  }
}

但是,我用于搜索的搜索字符串是非结构化的。这意味着我必须使用“ Poe Edgar Allan”之类的东西进行搜索,这是一个全名,其顺序可能与您期望的顺序不同。它只是一个字符串。无法分辨名字,中间名或姓氏。

如何调整模型以确保无论输入字符串(Edgar Allan Poe,Poe Edgar Allan,Edgar Poe,Poe Allan等)如何,我仍然能够根据我的解析器找到匹配项描述为一个?不知道姓,中间名或名字是什么。

0 个答案:

没有答案