【问题标题】:Elasticsearch Java API - Bool Query OperatorElasticsearch Java API - 布尔查询运算符
【发布时间】:2017-02-01 12:05:59
【问题描述】:

我在我的 Spring Boot 应用程序中使用 Elasticsearch 2.4.3 并使用以下查询

    QueryBuilder qb = new BoolQueryBuilder()
        .must(QueryBuilders.multiMatchQuery(term, "phoneticFirstName", "phoneticLastName", "phoneticLocationName", "phoneticCompanyName")
                .analyzer("atsCustomSearchAnalyzer")
                .operator(Operator.AND))
        .must(QueryBuilders.multiMatchQuery(term, "ngramFirstName^3", "ngramLastName^3", "ngramLocationName^3", "ngramCompanyName^3", "_all")
                .analyzer("atsCustomSearchAnalyzer")
                .operator(Operator.AND));

我想在第一个查询或第二个查询被命中的地方得到一个响应....你能帮我在我的代码中更改它吗?

更新

        "atsCustomPhoneticAnalyzer":{
            "type":"custom",
            "tokenizer":"whitespace",
            "filter":["lowercase","asciifolding","atsPhoneticFilter"]
        },
        "atsCustomSearchAnalyzer":{
            "type":"custom",
            "tokenizer":"whitespace",
            "filter":["lowercase","asciifolding","umlautStemmer","germanStemmer"]   
        }

更新 #2

    QueryBuilder qb = new BoolQueryBuilder()
        .should(QueryBuilders.multiMatchQuery(term, "ngramFirstName", "ngramLastName", "ngramLocationName", "ngramCompanyName")
            .type(Type.CROSS_FIELDS)
            .analyzer("atsCustomSearchAnalyzer")
            .operator(Operator.AND)
            .boost(3))
        .should(QueryBuilders.multiMatchQuery(term, "phoneticLastName")
            .analyzer("atsCustomPhoneticAnalyzer")
            .operator(Operator.AND))
        .should(QueryBuilders.matchQuery(term, "_all")
                .analyzer("atsCustomSearchAnalyzer")
                .operator(Operator.AND))
        .minimumNumberShouldMatch(1);

我有 2 个指标:人员和活动。当我注释掉第二个查询时,我会从人员和活动中获得 Hits。如果所有 3 个查询都存在,则活动的命中不再存在....

有什么想法吗?

【问题讨论】:

  • must改为should并添加minimumShouldMatch(1)
  • 感谢 Val,它有效!但是我的 Koelnerphonetic Query 不起作用:(它处理诸如“Mayer / Maier / Meyer / Meier”之类的事情,并说这些听起来是一样的......在我的问题中,我已经为此更新了我的映射/设置
  • 好的,nvm .....我只是在第一个查询中使用了错误的分析器

标签: java elasticsearch boolean


【解决方案1】:

只需将must 改为should 并添加minimumShouldMatch(1)

QueryBuilder qb = new BoolQueryBuilder()
    .minimumNumberShouldMatch(1)
    .should(QueryBuilders.multiMatchQuery(term, "phoneticFirstName", "phoneticLastName", "phoneticLocationName", "phoneticCompanyName")
            .analyzer("atsCustomSearchAnalyzer")
            .operator(Operator.AND))
    .should(QueryBuilders.multiMatchQuery(term, "ngramFirstName^3", "ngramLastName^3", "ngramLocationName^3", "ngramCompanyName^3", "_all")
            .analyzer("atsCustomSearchAnalyzer")
            .operator(Operator.AND));

【讨论】:

  • 感谢您的示例 - 它有效!但现在我遇到了另一个问题(请参阅问题更新 #2)
  • 你需要使用正确的分析器,你已经定义了atsCustomPhoneticAnalyzer但是你引用了atsCustomSearchAnalyzer
  • 将我的 CustomSearchAnalyzer 添加到问题区域中的映射示例中
  • 查看分析器的名称,它们与您在查询中使用的不匹配。
  • 好的,现在你已经解决了。我会说这个新问题会引起另一个问题,最初的问题正在解决。
猜你喜欢
  • 2017-09-18
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2014-09-09
  • 2017-08-31
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
相关资源
最近更新 更多