Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回elasticsearch java api中已分析的非存储文本字段的子字符串_Java_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

返回elasticsearch java api中已分析的非存储文本字段的子字符串

返回elasticsearch java api中已分析的非存储文本字段的子字符串,java,elasticsearch,Java,elasticsearch,我处理的项目有一个字符串字段(名称为urlOrContent),它可以很小(少于50个字符)也可以很长(超过50个字符),我只想每次根据特定的查询返回前50个字符。我的数据库是elasticsearch,我的问题在中提出,提问者的回答似乎是正确的(urlOrContent字段被分析,非存储文本字段)。它使用以下脚本: { "script_fields": { "substring": { "script": { "lang": "pai

我处理的项目有一个字符串字段(名称为urlOrContent),它可以很小(少于50个字符)也可以很长(超过50个字符),我只想每次根据特定的查询返回前50个字符。我的数据库是elasticsearch,我的问题在中提出,提问者的回答似乎是正确的(urlOrContent字段被分析,非存储文本字段)。它使用以下脚本:

{
   "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了解不多,而且我很难测试它。让这个领域的专家对此发表评论。