[Elasticsearch] 多字段搜索 (四) - 跨字段实体搜索

跨字段实体搜索(Cross-fields Entity Search)

现在让我们看看一个常见的模式:跨字段实体搜索。类似person,product或者address这样的实体,它们的信息会分散到多个字段中。我们或许有一个person实体被索引如下:

{
    "firstname":  "Peter",
    "lastname":   "Smith"
}

而address实体则是像下面这样:

{
    "street":   "5 Poland Street",
    "city":     "London",
    "country":  "United Kingdom",
    "postcode": "W1V 3DG"
}

这个例子也许很像在多查询字符串中描述的,但是有一个显著的区别。在多查询字符串中,我们对每个字段都使用了不同的查询字符串。在这个例子中,我们希望使用一个查询字符串来搜索多个字段。

用户也许会搜索名为"Peter Smith"的人,或者名为"Poland Street W1V"的地址。每个查询的单词都出现在不同的字段中,因此使用dis_max/best_fields查询来搜索单个最佳匹配字段显然是不对的。

一个简单的方法

实际上,我们想要依次查询每个字段然后将每个匹配字段的分值进行累加,这听起来很像bool查询能够胜任的工作:

{
  "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_fields来让它将所有匹配字段的分值合并:

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

使用most_fields存在的问题

使用most_fields方法执行实体查询有一些不那么明显的问题:

  • 它被设计用来找到匹配任意单词的多数字段,而不是找到跨越所有字段的最匹配的单词。
  • 它不能使用operator或者minimum_should_match参数来减少低相关度结果带来的长尾效应。

  • 每个字段的词条频度是不同的,会互相干扰最终得到较差的排序结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch中,当你为对应的实体类添加新的字段时,你需要更新你的索引映射(Mapping)以适应这些变化。这是因为Elasticsearch是基于文档模型的,每个索引都有其特定的结构定义,包括字段名、数据类型等信息。 以下是处理新字段添加的步骤: 1. **更新映射(Mapping)**: - 如果字段是新创建的,你需要在索引的配置文件中(通常是`.json`格式)添加这个字段,比如: ```json { "mappings": { "your_type": { "properties": { "new_field": { "type": "text" 或 "keyword" 或其他合适的数据类型 } } } } } ``` 确保替换"your_type"为你的实际类型名称。 2. **重新索引或刷新数据**: - 如果你只是添加了字段,而文档中的值尚未填充,可以使用`update_by_query` API 或 `reindex` API,将已有文档映射到新结构。 - 如果已有值,那么通常需要重新索引整个索引,这会更新所有文档的映射。 ```bash curl -X POST "localhost:9200/your_index/_reindex" --data-binary '{"source": {"index": "old_index"}, "dest": { "index": "new_index" }}' ``` 3. **验证和更新客户端代码**: - 在使用Elasticsearch客户端(如Elasticsearch.Net、Java的Elasticsearch Client等)时,也需要相应地更新代码,确保能正确地访问和操作新增的字段。 4. **可能需要的更新**: - 如果字段是用于搜索和聚合的,你可能需要更新搜索查询和聚合设置,以便正确处理包含新字段的查询。 - 如果字段有特殊的存储需求(如分析器、分词规则等),也要在映射中指定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值