Elasticsearch 2.x - возвращает список черепицы

У меня есть поле "searchtext", которое я предоставил подполе "shingle", и я проиндексировал это поле searchtext с помощью фильтра shingles.

Мне нужно получить список черепицы, созданной для этого поля, чтобы я мог выполнить некоторые операции с этим полем. Когда я получаю поле "searchtext.shingle", оно просто содержит оригинальный текст.

Означает ли это, что анализатор гальки, который я настроил, не работал, или что мне нужно вернуть список гальки по-другому?

2 ответа

Вы можете получить все термины из вашего "опоясывающего" поля, используя _termvectors конечная точка, как это:

curl -XGET 'http://localhost:9200/your_index/your_type/1/_termvectors?pretty=true' -d '{
  "fields" : ["searchtext.shingle"],
  "offsets" : true,
  "payloads" : true,
  "positions" : true,
  "term_statistics" : true,
  "field_statistics" : true
}'

В дополнение к ответу Val вы также можете проверить работу анализатора с помощью API Analyze. В качестве примера давайте создадим собственный анализатор и затем проверим, какие токены он генерирует для заданного ввода

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var defaultIndex = "analyzer-test";
var connectionSettings = new ConnectionSettings(pool)
        .DefaultIndex(defaultIndex);

var client = new ElasticClient(connectionSettings);

if (client.IndexExists(defaultIndex).Exists)
    client.DeleteIndex(defaultIndex);

client.CreateIndex(defaultIndex, c => c
    .Settings(s => s
        .Analysis(a => a
            .TokenFilters(tf => tf
                .Shingle("my_shingle", sh => sh
                    .MaxShingleSize(3)
                    .OutputUnigrams()
                )
            )
            .Analyzers(an => an
                .Custom("my_shingle_analyzer", sa => sa
                    .Tokenizer("standard")
                    .Filters("lowercase", "my_shingle")
                )
            )
        )
    )
);

Теперь, чтобы проверить это

var analysisResponse = client.Analyze(a => a
    .Index(defaultIndex)
    .Analyzer("my_shingle_analyzer")
    .Text("This is the text I want to analyze")
);

foreach (var token in analysisResponse.Tokens)
{
    Console.WriteLine($"{token.Token}");
}

испускает следующие токены

this
this is
this is the
is
is the
is the text
the
the text
the text i
text
text i
text i want
i
i want
i want to
want
want to
want to analyze
to
to analyze
analyze
Другие вопросы по тегам