Возвращает подстроку анализируемого несохраненного текстового поля в Java-API - PullRequest
1 голос
/ 16 марта 2019

Я работаю над проектом, в котором есть строковое поле (имя urlOrContent), и оно может быть небольшим (менее 50 символов) или очень длинным (более 50 символов), и я просто хочу вернуть первые 50 символовкаждый раз на основе конкретного запроса.Моя база данных - эластичный поиск, и моя проблема поднята в этой ссылке , и ответ спрашивающего представляется правильным (поле urlOrContent проанализировано, а текстовое поле не сохранено).Он использует следующий скрипт:

{
   "script_fields": {
      "substring": {
         "script": {
            "lang": "painless",
            "inline": "params._source.text.substring(0, 100)"
         }
      }
   }
}

Но моя главная проблема заключается в том, что я не могу найти эквивалент JavaSAI-кодаasticsearch.На самом деле, что следует добавить в приведенный ниже код, который возвращает только первые 50 символов поля urlOrContent?Обратите внимание, что в некоторых случаях это поле может даже не содержать 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();

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Я нашел лучший ответ.

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();

Обратите внимание, что вызов функции setFetchSource должен быть удален, а все возвращаемые поля должны быть возвращены через скрипт.

0 голосов
/ 18 марта 2019

Вы можете поместить свой запрос script_fields в объект запроса, то есть в setQuery (query) . Ваш объект запроса должен выглядеть вот так прямо сейчас.

    "query" : {
        "term" : { "user" : "kimchy" }
    }

После добавления полей script_fields в объект он должен выглядеть следующим образом:

"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
                   }"  
   }
  }
}

Полученные попадания будут иметь массив полей с необходимой подстрокой.

Вы должны включить сценарии, изменив файлasticsearch.yml, например, так и перезапустивasticsearch: script.engine.painless.inline.aggs: в

script.engine.painless.inline.update: on

script.inline: on

script.indexed: on

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...