现在学习到了实体搜索,加入我们想搜索例如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
这里不太会翻译 有需要的自己看吧。。。囧