`

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

阅读更多

原文链接:http://blog.csdn.net/dm_vincent/article/details/41862967

 

跨字段实体搜索(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方法执行实体查询有一些不那么明显的问题:

1、它被设计用来找到匹配任意单词的多数字段,而不是找到跨越所有字段的最匹配的单词。

2、它不能使用operator或者minimum_should_match参数来减少低相关度结果带来的长尾效应。

3、每个字段的词条频度是不同的,会互相干扰最终得到较差的排序结果。

分享到:
评论

相关推荐

    Java实体类字段生成工具类-将数据库表列字段转为Java实体类驼峰字段

    1、在Java开发中,常常需要将数据库表列字段换成Java实体类字段。但是手动实现这个转换过程比较慢,且容易出错,影响开发效率。为了解决这个问题,开发了这个Java实体类字段生成工具类。 2、该工具类可以将数据库表...

    springboot整合es-springboot-elasticsearch.zip

    SpringBoot整合Elasticsearch是现代Java开发中常见的一项任务,因为SpringBoot的便捷性和Elasticsearch的高效搜索能力,使得这种结合在数据检索、分析和日志存储等领域广泛应用。本项目"springboot-elasticsearch-...

    elasticsearch-analysis-ik-8.8.1.tar.gz

    这个名为 "elasticsearch-analysis-ik-8.8.1.tar.gz" 的压缩包包含了IK分词器的最新版本,即8.8.1,适用于在Linux环境中使用的SpringData Elasticsearch全文搜索项目。在本文中,我们将深入探讨IK分词器的功能、如何...

    elasticsearch-analysis-ik-7.8.0.tar.gz

    《SpringData Elasticsearch全文搜索与IK分词器详解》 在现代大数据时代,高效的数据检索成为企业信息化的关键。SpringData Elasticsearch作为一款强大的Java库,为开发者提供了便捷地利用Elasticsearch进行数据...

    elasticsearch-analysis-ik-8.6.0.tar.gz

    Elasticsearch 分析插件 IK 分词器是用于优化全文搜索引擎性能的重要工具,特别是在中文文本处理方面。在 Spring Data Elasticsearch 框架中,IK 分词器被广泛应用于提升搜索精度和用户体验。本文将深入探讨 IK 分词...

    elasticsearch-analysis-ik-8.9.0.tar.gz

    Elasticsearch 分析插件 IK (Inverted Index) 是一个为中文处理而设计的强大分词器,常用于Spring Data Elasticsearch项目中,以实现高效的全文检索功能。IK分词器能够智能地对中文文本进行切词,提高搜索引擎的精确...

    elasticsearch-analysis-ik-7.16.1.tar.gz

    Elasticsearch 是一个分布式、开源的搜索引擎,它提供了全文搜索、分析和存储功能,广泛应用于日志分析、监控、信息检索等多个领域。Spring Data Elasticsearch 是 Spring 框架的一部分,它为与 Elasticsearch 的...

    spring-data-elasticsearch-sample-application-master

    在IT领域,Elasticsearch作为一个强大的全文搜索引擎,因其高效、灵活和可扩展性,被广泛应用于数据检索、日志分析、监控等多种场景。Spring Data Elasticsearch是Spring Framework的一个子项目,它提供了一种方便的...

    SourceCode_elasticsearch-analysis-ik-6.1.3(1).zip

    2. **实体映射**:通过注解将Java对象映射为Elasticsearch的文档,如`@Document`和`@Field`注解。 3. **Repository接口**:定义Repository接口,Spring Data会自动提供CRUD操作以及基于Elasticsearch查询语言(DSL)...

    elasticsearch-analysis-ik-8.10.4.tar.gz

    在全文搜索引擎的世界里,Elasticsearch(ES)是一个非常流行的开源解决方案,它提供高效、可扩展的搜索功能。而为了实现对中文文本的精准分词,我们需要依赖特定的分词器。IK (Intelligent Chinese) 分词器是针对 ...

    elasticsearch-java-demo

    首先,定义一个实体类,例如`User`,并使用`@Document`注解标识它是Elasticsearch中的一个文档类型。然后,使用`index`或`save`方法将对象保存到索引中。 2. **查询(Search)**: Elasticsearch 提供了多种查询方式...

    SourceCode_elasticsearch-analysis-ik-8.10.4 (1).zip

    Elasticsearch作为一款强大的分布式搜索引擎,因其高效、可扩展的特性,被广泛应用于各类场景。而SpringData Elasticsearch是Spring Data项目的一部分,它为Elasticsearch提供了方便的Java API,使得开发者可以更加...

    springboot-es-search-master-master整合搜索引擎

    Elasticsearch则是一种基于Lucene的搜索服务器,提供了一个分布式、多用户能力的全文搜索引擎,基于RESTful接口,易于集成到各种应用程序中。 在SpringBoot项目中整合Elasticsearch,首先需要添加对应的依赖。在`...

    spring-data-elasticsearch中文使用文档

    除了基本操作,Spring Data Elasticsearch还支持聚合分析、脚本字段、父子文档、自定义映射等高级特性。例如,使用聚合来统计不同作者的书籍数量: ```java Aggregation aggregation = searchQueryBuilder....

    springboot整合 es-ytooo-elasticsearch.zip

    4. **实体映射**:定义 Elasticsearch 的实体类,使用 `@Document` 注解标识,并为每个字段添加对应的注解,比如 `@Field`,以指定索引、类型等属性。 5. **操作 Elasticsearch**:通过 Repository 实例,你可以...

    es整合springboot-elasticsearch-demo.zip

    **标题解析:** "es整合springboot-elasticsearch-demo" 这个标题暗示了这是一个关于如何将Elasticsearch集成到Spring Boot应用的示例项目。Elasticsearch是一个强大的分布式搜索引擎,而Spring Boot则是一个用于...

    Elasticsearch 集成spring-boot 搜索demo

    本示例"**Elasticsearch 集成spring-boot 搜索demo**"旨在展示如何在Spring Boot应用程序中无缝集成Elasticsearch,以实现高效的数据搜索功能。Elasticsearch是一个分布式、开源的全文搜索引擎,它提供了一个简单而...

    springboot-elasticsearch

    SpringBoot与Elasticsearch结合是现代Java开发中常见的技术栈,用于构建高效、可扩展的搜索引擎和数据分析系统。本文将深入探讨SpringBoot如何与Elasticsearch集成,以及相关的知识点。 一、SpringBoot简介 ...

    ElasticSearch.zip

    Elasticsearch(简称 ES)是一种基于 Lucene 的开源全文搜索引擎,被广泛应用于大数据分析、日志收集、实时搜索等领域。它的设计目标是分布式、可扩展、高可用且易用,支持RESTful API,使得与ES交互变得简单。 **...

    springboot-elasticsearch-master.rar

    2. **实体映射**:定义Elasticsearch的索引模型,通常我们创建一个Java类,使用`@Document`注解标记该类为Elasticsearch的文档类型,通过`@Field`注解来指定字段及其属性。 3. **Repository接口**:Spring Data ...

Global site tag (gtag.js) - Google Analytics