Подтвердить что ты не робот

Elasticsearch - возвращает маркеры поля

Как я могу получить маркеры определенного поля, возвращенного в результате

Например, запрос GET

curl -XGET 'http://localhost:9200/twitter/tweet/1'

возвращает

{
    "_index" : "twitter",
    "_type" : "tweet",
    "_id" : "1", 
    "_source" : {
        "user" : "kimchy",
        "postDate" : "2009-11-15T14:12:12",
        "message" : "trying out Elastic Search"
    } 
}

Я хотел бы иметь маркеры поля '_source.message', включенные в результат

4b9b3361

Ответ 1

Существует и другой способ сделать это, используя следующие скриптовые_файлы script:

curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{
    "query" : {
        "match_all" : { }
    },
    "script_fields": {
        "terms" : {
            "script": "doc[field].values",
            "params": {
                "field": "message"
            }
        }

    }
}'

Важно отметить, что хотя этот script возвращает фактические термины, которые были проиндексированы, он также кэширует все значения полей, а на больших индексах может использовать много памяти. Таким образом, по большим индексам было бы более полезно извлекать значения полей из сохраненных полей или источника и повторно их повторять на лету, используя следующий MVEL script:

import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import java.io.StringReader;

// Cache analyzer for further use
cachedAnalyzer=(isdef cachedAnalyzer)?cachedAnalyzer:doc.mapperService().documentMapper(doc._type.value).mappers().indexAnalyzer();

terms=[];
// Get value from Fields Lookup
//val=_fields[field].values;

// Get value from Source Lookup
val=_source[field];

if(val != null) {
  tokenStream=cachedAnalyzer.tokenStream(field, new StringReader(val)); 
  CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute); 
  while(tokenStream.incrementToken()) { 
    terms.add(termAttribute.toString())
  }; 
  tokenStream.close(); 
} 
terms

Этот MVEL script может быть сохранен как config/scripts/analyze.mvel и использоваться со следующим запросом:

curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{
    "query" : {
        "match_all" : { }
    },
    "script_fields": {
        "terms" : {
            "script": "analyze",
            "params": {
                "field": "message"
            }
        }

    }
}'

Ответ 2

Если вы имеете в виду индексы, которые были проиндексированы, вы можете сделать term facet в поле сообщения. Увеличьте значение size, чтобы получить больше записей, или установите 0, чтобы получить все условия.

Lucene предоставляет возможность хранить термин "векторы", но теперь нет возможности получить к нему доступ с помощью elasticsearch (насколько я знаю).

Зачем вам это нужно? Если вы только хотите проверить, что вы индексируете, вы можете посмотреть проанализировать api.