java - 如何在elasticsearch中匹配精确值?

标签 java elasticsearch lucene

我已经对三个文件的元数据建立了索引,它们属于“text/plain”mime 类型。

但是当我尝试将其他 mime-types 与“text/plain”匹配时,以下内容会被匹配!

以下是与“text/plain”匹配的 mime-types 列表,其中包含 hitsscore:

***********************************
1. Mime-Type text/vnd.motorola.reflex
2. Total Hits 3
3. Max Score 0.07154637
***********************************
1. Mime-Type text/vnd.ms-mediapackage
2. Total Hits 3
3. Max Score 0.034633614
***********************************
1. Mime-Type text/vnd.net2phone.commcenter.command
2. Total Hits 3
3. Max Score 0.07154637
***********************************
1. Mime-Type text/plain
2. Total Hits 3
3. Max Score 0.629606
***********************************

我希望 mime-type 应该完全匹配并且应该只考虑最后一个。如果您注意到它给出的最大分数高于上述所有值。

搜索代码:

查询=“文本/纯文本”; 过滤器=“mimeType”

public long getHitsCount(String query, String filter, Project project) {
        try {
            /*TermQueryBuilder QueryBuilder =  new TermQueryBuilder(filter, smartEscapeQuery(query));*/
           /* QueryStringQueryBuilder QueryBuilder = new QueryStringQueryBuilder(smartEscapeQuery(query)).field(filter);*/
            MatchQueryBuilder QueryBuilder = QueryBuilders.matchQuery(filter, smartEscapeQuery(query));
            QueryBuilder qb = QueryBuilders
                    .boolQuery()
                    .must(QueryBuilder);

            SearchRequestBuilder requestBuilder;
                requestBuilder = client.prepareSearch()
                        .setIndices(getDomainIndexId(project))
                        .setTypes(getProjectTypeId(project))
                        .setSearchType(SEARCH_TYPE)
                        .setQuery(qb);


            SearchResponse response = requestBuilder.execute().actionGet(ES_TIMEOUT_MS);
            SearchHits hits = response.getHits();
            if (hits.getTotalHits() > 0) {
                return hits.getTotalHits();
            }else{
                return 0l;
            }
        } catch (IndexMissingException ex) {

        }
       return 0;
    } 

/**
     * Escape the string from bad chars for the search
     *
     * @param str the String that should be escaped
     * @return an escaped String
     */
    @SuppressWarnings({"ConstantConditions"})
    private static String smartEscapeQuery(String str) {
        if (StringUtils.isBlank(str)) {
            return "";
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c == '\\' || c == '+' || c == '-' || c == '!' || c ==
                    '(' || c == ')' || c == ':'
                    || c == '^' || c == '[' || c == ']' || c == '\"'
                    || c == '{' || c == '}' || c == '~' || c == '/'
                    || c == '?' || c == '|' || c == '&' || c == ';'
                    || (!Character.isSpaceChar(c) &&
                    Character.isWhitespace(c))) {
                sb.append('\\');
            }
            sb.append(c);
        }
        return sb.toString();
    }

匹配查询:

    {
      "bool" : {
        "must" : {
          "match" : {
            "mimeType" : {
              "query" : "text\\/plain",
              "type" : "boolean"
            }
          }
        }
      }
    }
Result: 3 Hits

术语查询:

{
  "bool" : {
    "must" : {
      "term" : {
        "mimeType" : "text\\/plain"
      }
    }
  }
}

Result: 0 Hits

我尝试过 TermQueryMatchQuery 但没有成功。我在索引时使用 AutoDetectParser 。

如何匹配elasticsearch中的确切值,以便在上面的示例中它应该只与“text/plain”匹配而不是匹配的值?

最佳答案

在第一个示例中,您有一个“匹配查询”类型的查询。因此,您的查询会在搜索之前进行分析(文本或纯文本)。 您通过索引使用了哪个分析器?或者对“not_analyzed”这个字段有帮助吗? 在第二个示例中,您使用“术语查询”类型。这还需要一个“not_analyzed”字段。

关于java - 如何在elasticsearch中匹配精确值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27395157/

相关文章:

java - 如何返回java数组中的每隔一个元素

java - 获得完美功率数的幂

ruby-on-rails - 获得Tire::Results::Collection的随机结果

elasticsearch - Lucene和Elasticsearch超出了文档限制

java - 大文件的术语主题矩阵

java - 使用 Netbeans 6.5 GUI Builder 创建 JButton 数组

java - android 日历 API 与 android 的谷歌日历 API 相同吗?

elasticsearch - 检查 Elasticsearch 中的列表字段

elasticsearch - elasticsearch phrase suggester 不从文本中删除空格

Solr查询多个集合