【问题标题】:ElasticSearch QueryBuilder must_not clause strange behaviourElasticSearch QueryBuilder must_not 子句的奇怪行为
【发布时间】:2018-09-16 09:45:50
【问题描述】:

根据文档

must_not子句(查询)不得出现在匹配的文档中。

我有这样的查询:

// searching for URI which contains smart and doesn't contain vip.vs.csin.cz
BoolQueryBuilder builder = QueryBuilders.boolQuery();
builder.must(QueryBuilders.termQuery(URI, "smart")));
builder.mustNot(QueryBuilders.termQuery(URI, "vip.vs.csin.cz")));

在我的 elasticsearch 存储库中有两个 URI

1)

/smart-int-vip.vs.csin.cz:5080/smart/api/runtime/case/SC0000000000558648/record/generate/4327/by/SMOBVA002/as/true?espisRecordForm=ANALOG&accountNumber=2318031033/0800

2)

/smart/api/runtime/case/SC0000000000558648/record/generate/4327/by/SMOBVA002/as/true?espisRecordForm=ANALOG&accountNumber=2318031033/0800

当我通过 ElasticSearchTemplate

执行查询时
elasticsearchTemplate.getClient().search(searchRequest);

我返回 0 条记录。当我在没有 mustNot 子句的情况下执行相同的查询时,我会返回 2 条记录。
在 kibana 中我可以写:

uri: "smart" NOT uri: "vip.vs.csin.cz"

并按预期获得 1 条记录

我期待来自 Java ElasticSearchClient 的相同行为。如何从 Java 中过滤包含“vip.vs.csin.cz”的记录以及为什么它过滤了第二条记录,即使它不包含我指定的 mustNot 子句中的任何内容?

在这里编辑我的映射

@Document(indexName = "audit-2018", type = "audit")
public class Trace {

    @Id
    private String id;
    @Field(type = FieldType.Text)
    private String uri;

    // more columns, getter & setters
}

【问题讨论】:

  • 如果您也分享索引的映射,我们将更加受益。
  • 我添加了索引映射,谢谢

标签: java elasticsearch


【解决方案1】:

您提供的 Java 代码显示了使用 mustmust_not 子句的布尔查询,其中您正在执行术语查询。关于术语查询的事情是它们受制于您对字段的分析器,text 的标准分析器(这是您的 uri 字段的数据类型,read more here)字段将删除所有标点符号(在换句话说,你的单词中的点)并将你的单词分开。 vip.vs.csin.cz 变为 vip vs csin cztext 字段类型应仅用于全文搜索,在您的情况下,我会选择 keyword 字段类型 (read more here) 您的 Kibana 查询按预期工作的原因是因为该查询实际上并未执行术语查询,而是包含 lucene 查询的 query_string 查询:uri: "smart" NOT uri: "vip.vs.csin.cz"

因此,您有几个选项可以解决您的问题。您可以将您的条款查询更改为match_phrase 查询,这将允许您保留标记化条款的顺序并可能获得正确的结果。另一种方法是在 Java 代码中执行 query_string 查询而不是术语查询,因为您已经确定这确实会为您提供正确的结果。

然而,我建议的解决方案是重新索引 uri 的字段类型为 keyword,因为此字段类型不会导致您的字段值不必要地标记为多个术语。您可以阅读有关keyword 字段类型here 的默认分析器和标记器的更多信息。这将使您在未来免于头疼,因为您知道您的查询与您的字段值完全“按原样”匹配。

【讨论】:

    猜你喜欢
    • 2020-07-14
    • 2023-03-05
    • 2011-04-02
    • 2014-12-23
    • 2017-03-29
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多