【问题标题】:ElasticSearch - matchPhraseQuery API to search with multiple fieldsElasticSearch - matchPhraseQuery API 用于搜索多个字段
【发布时间】:2018-07-17 08:59:05
【问题描述】:

我正在搜索具有 ngram 标记器的特定字段,并正在使用 matchPhraseQuery 查询该字段(代码),它工作正常。

现在,我想用 3 个字段进行搜索。我们该怎么做呢?

请找到我的 java 代码,它只搜索一个字段(代码)。

SearchRequest searchRequest = new SearchRequest(INDEX);
searchRequest.types(TYPE);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryBuilder qb = QueryBuilders.matchPhraseQuery("code", code);
searchSourceBuilder.query(qb);
searchSourceBuilder.size(10);
searchRequest.source(searchSourceBuilder);

请在下面找到我的映射详细信息:

PUT products
{
"settings": {
"analysis": {
  "analyzer": {
    "custom_analyzer": {
      "type": "custom",
      "tokenizer": "ngram",
      "char_filter": [
        "html_strip"
      ],
      "filter": [
        "lowercase",
        "asciifolding"
      ]
    }
  }
}
},
"mappings": {
"doc": {
  "properties": {
    "code": {
      "type": "text",
       "analyzer": "custom_analyzer"
      },
      "attribute" : {
      "type" : "text",
      "analyzer" : "custom_analyzer"
      },
      "term" : {
      "type" : "text",
      "analyzer" : "custom_analyzer"
      }
    }
  }
 }
}

现在,我想对 3 个字段代码、属性、术语进行搜索查询

我尝试了以下 java 代码,但没有按预期工作:

BoolQueryBuilder orQuery = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.matchPhraseQuery("catalog_keywords", keyword);
QueryBuilder qb2 = QueryBuilders.matchPhraseQuery("product_keywords", keyword);
orQuery.should(qb1);
orQuery.should(qb2);
orQuery.minimumShouldMatch(1);
searchSourceBuilder.query(orQuery);
searchSourceBuilder.size(10);
searchRequest.source(searchSourceBuilder);

我的输入查询:

Logi

输出越来越像:

"Materiały, programy doborowe | Marketing | Katalogi, broszury"

这与我的查询完全无关。预期结果是,Logiciels

而且我的字段值带有分隔符|,所以我只想要单词/字符的完全匹配。它不应该打印所有的分隔符和所有。

【问题讨论】:

    标签: java elasticsearch elastic-stack


    【解决方案1】:

    使用bool query

    GET products/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match_phrase": {
                "FIELD": "PHRASE"
              }
            },
            {
              "match_phrase": {
                "FIELD": "PHRASE"
              }
            },
            {
              "match_phrase": {
                "FIELD": "PHRASE"
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    • 我使用 java api 尝试过类似的事情,但无法正常工作。我已经更新了我的问题的详细信息。
    • 你知道如何在java api中形成多匹配查询吗?
    猜你喜欢
    • 2018-12-22
    • 1970-01-01
    • 2013-09-12
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多