java - Elasticsearch:从文档中检索长文本字段
问题描述
我有一个在 ES 中索引的文档。此文档有 3 个文本字段F1
,F2
和F3
.
当我尝试使用 Java API 搜索此文档时,我只有 fieldsF1
和的值F2
,并且 fieldF3
显示为空。
QueryBuilder query = //Some query
SearchResponse response = client.prepareSearch(index)
.addDocValueField("F1.keyword")
.addDocValueField("F2.keyword")
.addDocValueField("F3.keyword")
.setQuery(query)
.execute()
.actionGet();
SearchHit hit = response.getHits().getAt(0);
System.out.println("F1 : "+hit.getField("F1.keyword").getValue());
System.out.println("F2 : "+hit.getField("F2.keyword").getValue());
System.out.println("F3 : "+hit.getField("F3.keyword").getValue()); // empty
我的领域F3
可能很长。在我用于测试的文档中,它包含超过 300 个字符,并且可能更长。
我的索引映射是:
"mappings": {
"MyIndex": {
"properties": {
"F1": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"F2": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"F3": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
所以我将ignore_above
映射中的字段更新F3
为 20000(可能是个坏主意?),但我仍然有相同的行为。
有什么问题,正确的方法是什么?
备注:
- 使用 ES 5.6.3
- 我不需要对该字段进行任何分析/术语搜索
F3
,仅在查询匹配F1
或F2
. - 我会有少量这种文件,所以效率不是大问题
编辑 :
奇怪的是,当我使用带有查询的浏览器请求 elasticsearch 时,我得到了预期的结果:
http://localhost:9200/MyIndex/_search?pretty=true?{"query": {"match_all": {}}}
解决方案
在 Elasticsearch 中,默认行为将文本字符串映射到两种不同的 Elasticsearch 类型:text
和keyword
. 它们是不同的东西,用于不同的目的,主要是它text
是一个全文搜索字段,而keyword
就像一个结构化的常量值。在文档中阅读更多内容
在您的情况下,该keyword
字段的默认包含看起来没有帮助。在您的查询中,您应该只获取“常规”F3
字段,和/或常规F1
字段F2
。
最后,我对 ES Java 客户端不是很熟悉,但如果你想做源过滤(即只从你的请求中获取值的子集),我认为这addDocValueField()
是不对的。查看:https ://www.elastic.co/guide/en/elasticsearch/client/java-rest/5.6/java-rest-high-search.html#_source_filtering
推荐阅读
- tensorflow - 为什么 Keras Dropout 中的非零值会发生变化?
- vue.js - 如何在 vuejs2 中更改路由器返回路由
- gcc - 如何安装/能够在 Code::Blocks 中使用 Fortran 执行“使用 FMZM”
- amazon-web-services - 不同的 ECS 停止时间是什么意思?
- html - 您如何在屏幕点击时播放 html5 视频?
- jenkins - 当方法没有参数时,这个 Groovy 代码可以简化吗?
- c - qsort 函数与带有 char poiter 成员的 structre 一起工作
- javascript - JSDOM 从字符串中删除尾随的新行和空格
- php - PHPMailer 联系表 - 联系表。打开页面后的错误
- html - 从谷歌搜索控制台中删除属性是否会从搜索结果中删除该网站?