java - 多个字段的短语匹配

标签 java elasticsearch elasticsearch-java-api

这是我现在的做法:

.. .setQuery( 过滤查询( multiMatchQuery(String.format("*%s*", query), "姓名", "地址", "电话") .type(MultiMatchQueryBuilder.Type.CROSS_FIELDS), 地理距离过滤器(“位置”) .distance(半径, DistanceUnit.千米) .geoDistance(GeoDistance.PLANE) .point(纬度、经度) ) ) ..

问题是它不会搜索部分短语或单词的一部分..即使使用通配符..

我找到了matchPhraseQuery,但它似乎只适用于一个字段。是否有其他方法来实现这样的搜索?

最佳答案

不幸的是,多重匹配不支持查询通配符。听起来您可能想看看 Query String Query 而不是使用多重匹配。 ,它具有更多的模式匹配灵 active ,并且可以针对多个字段运行。查询字符串非常强大,因为它为您提供了 Lucene 查询语言供您使用。它的 DSL 看起来像:

    {
        "query_string" : {
            "fields" : ["name", "address", "phone"],
            "query" : "*query*"
        }
    }

在 Java 中,大致如下:

..
.setQuery(
   filteredQuery(
       .queryString("*test*").field("name").field("phone").field("address"),
       geoDistanceFilter("location")
             .distance(radius, DistanceUnit.KILOMETERS)
             .geoDistance(GeoDistance.PLANE)
             .point(latitude, longitude)
      )
)
..

搜索时不鼓励使用通配符和模式匹配,因为它们的计算成本很高。您应该尝试使用类似 NGram Tokenizer 的内容来查看这些模糊搜索案例的索引时间解决方案。在必填字段上生成这些部分匹配。考虑使用不同类型的分析器来获得更好的搜索索引,而不是试图让查询构建器屈服于您的意愿。

关于java - 多个字段的短语匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31389296/

相关文章:

几秒钟后elasticsearch 6索引更改为只读

elasticsearch - 如何使用 ElasticSearch Java API 从 JSON 构建聚合

java - 如何使用 ConstraintLayout 创建此布局

java - 处理 JSF 应用程序中的异常

elasticsearch - Elasticsearch升级拥有大量数据

elasticsearch - 如何使用ElasticSearch正确过滤/排序?

elasticsearch - 如何使用 JAVA API 在 Elasticsearch 版本 8 中创建批量 CRUD 操作请求?

elasticsearch - 在单个请求的同一列内进行 Elasticsearch 多个正则表达式搜索?

java - 当我执行 driver.findElementById ("some id").click() 时内部会发生什么?它执行javascript吗?

java - 如何使用 Dockerfile 安装特定版本的 Java 8