ElasticSearch--实体搜索

现在学习到了实体搜索,加入我们想搜索例如Person、product这样的实体,在这种情况下,一些关键的信息其实分布在数据的多个属性里的。比如person的数据存储

{
    "firstname":  "Peter",
    "lastname":   "Smith"
}
或者是地址,比如这样

 ```
{
    "street":   "5 Poland Street",
    "city":     "London",
    "country":  "United Kingdom",
    "postcode": "W1V 3DG"
}
 这里听起来更像是 Multiple Query Strings(查找多个字段),但是在这两种情况中存在着巨大的差异。在Multiple Query Strings中,我用多个分开的访问字符串来访问每个属性。在这种情况中,我们想搜索多个属性,且通过仅仅一个搜索字符串。
 我们的用户可能想搜索person "Peter Smith"。但是每一个单词出现在不同的属性里,而用dis_mas/best_fields 访问(这些都是针对单个属性的查询)绝对是一错误的方式。

一个朴素的方法
我们可以访问每个属性并且将每一个属性匹配的score综合起来,例如

{
  "query": {
    "bool": {
      "should": [
        { "match": { "street":    "Poland Street W1V" }},
        { "match": { "city":      "Poland Street W1V" }},
        { "match": { "country":   "Poland Street W1V" }},
        { "match": { "postcode":  "Poland Street W1V" }}
      ]
    }
  }
}

很明显,为每一个属性重复这些访问字符串很快变的很啰嗦。当然我们可以用 multi_match来替代,并且设type和most_fileds 去告诉它把所有属性的匹配度分值综合起来

{
  "query": {
    "multi_match": {
      "query":       "Poland Street W1V",
      "type":        "most_fields",
      "fields":      [ "street", "city", "country", "postcode" ]
    }
  }
}

用most_fields方法所产生的问题
most_fileds 方法来进行实体的搜索所产生的问题看起来不太明显
https://www.elastic.co/guide/en/elasticsearch/guide/current/_cross_fields_entity_search.html
这里不太会翻译 有需要的自己看吧。。。囧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章