我已经对三个文件的元数据建立了索引,它们属于“text/plain”mime 类型。
但是当我尝试将其他 mime-types
与“text/plain”匹配时,以下内容会被匹配!
以下是与“text/plain”匹配的 mime-types
列表,其中包含 hits
和 score
:
***********************************
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
我尝试过 TermQuery
和 MatchQuery
但没有成功。我在索引时使用 AutoDetectParser 。
如何匹配elasticsearch中的确切值,以便在上面的示例中它应该只与“text/plain”匹配而不是匹配的值?
最佳答案
在第一个示例中,您有一个“匹配查询”类型的查询。因此,您的查询会在搜索之前进行分析(文本或纯文本)。 您通过索引使用了哪个分析器?或者对“not_analyzed”这个字段有帮助吗? 在第二个示例中,您使用“术语查询”类型。这还需要一个“not_analyzed”字段。
关于java - 如何在elasticsearch中匹配精确值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27395157/