返回elasticsearch java api中已分析的非存储文本字段的子字符串
我处理的项目有一个字符串字段(名称为urlOrContent),它可以很小(少于50个字符)也可以很长(超过50个字符),我只想每次根据特定的查询返回前50个字符。我的数据库是elasticsearch,我的问题在中提出,提问者的回答似乎是正确的(urlOrContent字段被分析,非存储文本字段)。它使用以下脚本:返回elasticsearch java api中已分析的非存储文本字段的子字符串,java,
elasticsearch,Java,
elasticsearch,我处理的项目有一个字符串字段(名称为urlOrContent),它可以很小(少于50个字符)也可以很长(超过50个字符),我只想每次根据特定的查询返回前50个字符。我的数据库是elasticsearch,我的问题在中提出,提问者的回答似乎是正确的(urlOrContent字段被分析,非存储文本字段)。它使用以下脚本: { "script_fields": { "substring": { "script": { "lang": "pai
{
"script_fields": {
"substring": {
"script": {
"lang": "painless",
"inline": "params._source.text.substring(0, 100)"
}
}
}
}
但我的主要问题是,我找不到与elasticsearch java api代码等价的代码。事实上,下面的代码只返回urlOrContent字段的前50个字符,应该添加什么?请注意,在某些情况下,此字段甚至可能没有50个字符,然后应返回整个字符串
String queryString =
EnumLinkFields.CREATE_TIME.getFieldName() + ":(>=" + dateFrom + " AND <=" + dateTo + ")";
QueryBuilder query = QueryBuilders.queryStringQuery(queryString);
SearchResponse response = TRANSPORT_CLIENT.prepareSearch(MY_INDEX)
.setTypes(MY_TYPE)
.setSearchType(SEARCH_TYPE)
.setQuery(query)
.setFetchSource(null, new String[]{EnumLinkFields.USER_ID.getFieldName()})
.setFrom(offset)
.setSize(count)
.addSort(orderByField, sortOrder)
.execute().actionGet();
字符串查询字符串=
EnumLinkFields.CREATE_TIME.getFieldName()+”:(>=“+dateFrom+”和您可以将脚本字段查询放在查询对象中,即setQuery(查询)中。
您的查询对象现在应该是这样的
"query" : {
"term" : { "user" : "kimchy" }
}
在对象中添加脚本_字段后,它应为:
"query" : {
"term" : { "user" : "kimchy" }
},
"script_fields": {
"urlOrContent": {
"script": {
"lang": "painless",
"inline": "if(params._source.urlOrContent.length() > 50){
params._source.urlOrContent.substring(0, 50)
}
else {
params._source.urlOrContent
}"
}
}
}
结果命中将有一个带有所需子字符串的字段数组
您必须通过像这样更改elasticsearch.yml文件来启用脚本,然后重新启动elasticsearch:
script.engine.painless.inline.aggs:on
script.engine.painless.inline.update:on
script.inline:on
script.indexed:on可以将脚本字段查询放在查询对象中,即setQuery(查询)中。
您的查询对象现在应该是这样的
"query" : {
"term" : { "user" : "kimchy" }
}
在对象中添加脚本_字段后,它应为:
"query" : {
"term" : { "user" : "kimchy" }
},
"script_fields": {
"urlOrContent": {
"script": {
"lang": "painless",
"inline": "if(params._source.urlOrContent.length() > 50){
params._source.urlOrContent.substring(0, 50)
}
else {
params._source.urlOrContent
}"
}
}
}
结果命中将有一个带有所需子字符串的字段数组
您必须通过像这样更改elasticsearch.yml文件来启用脚本,然后重新启动elasticsearch:
script.engine.painless.inline.aggs:on
script.engine.painless.inline.update:on
script.inline:on
script.index:on我找到了最好的答案
String queryString =
EnumLinkFields.CREATE_TIME.getFieldName() + ":(>=" + dateFrom + " AND <=" + dateTo + ")";
QueryBuilder query = QueryBuilders.queryStringQuery(queryString);
String codeUrlOrContent = "if (" + EnumElasticScriptField.URL_OR_CONTENT.getFieldName() + ".length() > 50) {" +
"return " + EnumElasticScriptField.URL_OR_CONTENT.getFieldName() + ".substring(0, 50);" +
"} else { " +
"return " + EnumElasticScriptField.URL_OR_CONTENT.getFieldName() + "; }";
Script scriptUrlOrContent = new Script(ScriptType.INLINE, "painless",
codeUrlOrContent, Collections.emptyMap());
Script scriptIsUrl = new Script(ScriptType.INLINE, "painless",
EnumElasticScriptField.IS_URL.getFieldName(), Collections.emptyMap());
SearchResponse response = TRANSPORT_CLIENT.prepareSearch(MY_INDEX)
.setTypes(MY_TYPE)
.setSearchType(SEARCH_TYPE)
.setQuery(query)
.addScriptField(EnumLinkFields.URL_OR_CONTENT.getFieldName(),
scriptUrlOrContent)
.addScriptField(EnumLinkFields.IS_URL.getFieldName(), scriptIsUrl)
.setFrom(offset)
.setSize(count)
.addSort(orderByField, sortOrder)
.execute().actionGet();
字符串查询字符串=
EnumLinkFields.CREATE_TIME.getFieldName()+“:(>=“+dateFrom+”和50){”+
返回“+EnumElasticScriptField.URL_或_CONTENT.getFieldName()+”。子字符串(0,50)+
“}否则{”+
“return”+EnumElasticScriptField.URL_或_CONTENT.getFieldName()+“;}”;
Script scriptUrlOrContent=新脚本(ScriptType.INLINE,“无痛”,
codeUrlOrContent,Collections.emptyMap());
Script scriptIsUrl=新脚本(ScriptType.INLINE,“无痛”,
EnumElasticScriptField.IS_URL.getFieldName(),Collections.emptyMap());
SearchResponse=TRANSPORT\u CLIENT.prepareSearch(我的索引)
.setTypes(我的类型)
.setSearchType(搜索类型)
.setQuery(查询)
.addScriptField(EnumLinkFields.URL\u或内容.getFieldName(),
scriptUrlOrContent)
.addScriptField(EnumLinkFields.IS_URL.getFieldName(),scriptIsUrl)
.setFrom(偏移量)
.setSize(计数)
.addSort(orderByField、sortOrder)
.execute().actionGet();
请注意,必须删除对setFetchSource函数的调用,并且必须通过脚本返回所有返回的字段。我找到了最佳答案
String queryString =
EnumLinkFields.CREATE_TIME.getFieldName() + ":(>=" + dateFrom + " AND <=" + dateTo + ")";
QueryBuilder query = QueryBuilders.queryStringQuery(queryString);
String codeUrlOrContent = "if (" + EnumElasticScriptField.URL_OR_CONTENT.getFieldName() + ".length() > 50) {" +
"return " + EnumElasticScriptField.URL_OR_CONTENT.getFieldName() + ".substring(0, 50);" +
"} else { " +
"return " + EnumElasticScriptField.URL_OR_CONTENT.getFieldName() + "; }";
Script scriptUrlOrContent = new Script(ScriptType.INLINE, "painless",
codeUrlOrContent, Collections.emptyMap());
Script scriptIsUrl = new Script(ScriptType.INLINE, "painless",
EnumElasticScriptField.IS_URL.getFieldName(), Collections.emptyMap());
SearchResponse response = TRANSPORT_CLIENT.prepareSearch(MY_INDEX)
.setTypes(MY_TYPE)
.setSearchType(SEARCH_TYPE)
.setQuery(query)
.addScriptField(EnumLinkFields.URL_OR_CONTENT.getFieldName(),
scriptUrlOrContent)
.addScriptField(EnumLinkFields.IS_URL.getFieldName(), scriptIsUrl)
.setFrom(offset)
.setSize(count)
.addSort(orderByField, sortOrder)
.execute().actionGet();
字符串查询字符串=
EnumLinkFields.CREATE_TIME.getFieldName()+“:(>=“+dateFrom+”和50){”+
返回“+EnumElasticScriptField.URL_或_CONTENT.getFieldName()+”。子字符串(0,50)+
“}否则{”+
“return”+EnumElasticScriptField.URL_或_CONTENT.getFieldName()+“;}”;
Script scriptUrlOrContent=新脚本(ScriptType.INLINE,“无痛”,
codeUrlOrContent,Collections.emptyMap());
Script scriptIsUrl=新脚本(ScriptType.INLINE,“无痛”,
EnumElasticScriptField.IS_URL.getFieldName(),Collections.emptyMap());
SearchResponse=TRANSPORT\u CLIENT.prepareSearch(我的索引)
.setTypes(我的类型)
.setSearchType(搜索类型)
.setQuery(查询)
.addScriptField(EnumLinkFields.URL\u或内容.getFieldName(),
scriptUrlOrContent)
.addScriptField(EnumLinkFields.IS_URL.getFieldName(),scriptIsUrl)
.setFrom(偏移量)
.setSize(计数)
.addSort(orderByField、sortOrder)
.execute().actionGet();
请注意,必须删除对setFetchSource函数的调用,并且必须通过脚本返回所有返回的字段。为什么不能在elasticsearch查询中使用脚本?对不起,我是elasticsearch新手。请解释如何在查询中使用脚本?为什么不能在elasticsearch查询中使用脚本?对不起,我是elasticsearch的新手。请您解释一下如何在查询中使用脚本好吗?如果字符串长度小于50个字符,将引发异常。如果字符串长度小于50个字符,将引发异常。Kudos。我不使用java api,所以我不能对此说太多。但请告诉我更新的解决方案是否有效。(供将来参考)。@DEVCNN。您可能需要在if块中输入一个return关键字。我对elasticsearch了解不多,而且我很难测试它。请让这个领域的专家对此进行评论。我不使用java api,所以我不能对此说太多。但请告诉我更新的解决方案是否有效。(供将来参考)@DEVCNN。你可能需要在if块中输入一个return关键字。我对elasticsearch了解不多,而且我很难测试它。让这个领域的专家对此发表评论。