Java Elasticsearch:从文档中检索长文本字段
我有一个用ES索引的文档。此文档有3个文本字段Java Elasticsearch:从文档中检索长文本字段,java,
elasticsearch,Java,
elasticsearch,我有一个用ES索引的文档。此文档有3个文本字段F1、F2和F3 当我尝试使用Java API搜索此文档时,我只有字段F1和F2的值,字段F3显示为空 QueryBuilder query = //Some query SearchResponse response = client.prepareSearch(index) .addDocValueField("F1.keyword") .addDocValueField("F2
F1
、F2
和F3
当我尝试使用Java API搜索此文档时,我只有字段F1
和F2
的值,字段F3
显示为空
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
}
}
}
}
}
}
因此,我将映射中的F3
上方的ignore\u字段更新到20000(可能是个坏主意?),但我仍然有相同的行为
问题是什么?正确的方法是什么
注:
- 使用ES 5.6.3
- 我不需要对字段
F3
进行任何分析/术语搜索,只在查询匹配F1
或F2
时检索它的值
- 我将有少量此类文件,因此效率不是大问题
编辑:
奇怪的是,当我使用带查询的浏览器请求elasticsearch时,我得到了预期的结果:
http://localhost:9200/MyIndex/_search?pretty=true?{"query": {"match_all": {}}}
在Elasticsearch中,默认行为将文本字符串映射为两种不同的Elasticsearch类型:text
和keyword
。它们是不同的东西,用于不同的目的,主要是文本
是全文搜索字段,而关键字
类似于结构化常量值。阅读更多
在您的情况下,关键字
字段的默认包含看起来没有帮助。在您的查询中,您应该只抓取“常规”F3
字段和/或F1
和F2
的常规字段
最后,我不太熟悉ES Java客户机,但是如果您想进行源代码筛选(即从请求中只获取一部分值),我认为addDocValueField()
是不对的。签出:它可以使用setFetchSource()
代替addDocValueField()
并且不使用关键字。非常感谢。