Клиент .Net Nest с функцией выделения вложений

Недавно я начал использовать Elastic Search с его .net-клиентом NEST. Много вопросов, чтобы задать.

В настоящее время я заблокирован при попытке выделить результаты поиска в поле вложения с помощью плагина elasticsearch-mapper-attachments. Индексация работает хорошо, сопоставление кажется правильным, кодирование и декодирование тоже работают хорошо,

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

Прочтите другой пост, посвященный некоторым тем же функциям, решение состоит в том, чтобы установить store = yes и TermVector = TermVectorOption.WithPositionsOffsets.

Поэтому я попытался настроить его в своем файле класса С# с помощью

[ElasticProperty(Name = "attach", Type = FieldType.Attachment, Store=true, TermVector = TermVectorOption.WithPositionsOffsets)] 
public string attach { get; set; } 

и запрос следующий (однако результат выделения не возвращается)

{ 
"fields" : ["name","attach"], 
  "query" : { 
    "query_string" : { 
      "query" : "settings" 
    } 
  }, 
  "highlight" : { 
    "fields" : { 
      "attach" : {} 
    } 
  } 
} 

Кажется, при создании сопоставления для типа из класса атрибут вложения был установлен неправильно: поскольку при проверке с помощью localhost:9200/myindex/mytype/_mapping?pretty атрибут вложения не имеет Store=true, TermVector = TermVectorOption.WithPositionsOffsets для него .

У вас есть идея, пожалуйста? Спасибо


person Yuan    schedule 18.09.2014    source источник
comment
Ответ был дан в Github Nest github.com/elasticsearch/elasticsearch-net/issues. /972   -  person Yuan    schedule 06.10.2014


Ответы (1)


Мне не удалось заставить это работать исключительно с ответом на проблему с GitHub, хотя это и направило меня в правильном направлении. После проб и ошибок вот что у меня получилось:

Класс документа

public class Doc
{
    public string File { get; set; }
    // As an example for including additional fields:
    public string Title { get; set; } 
}

Вложение будет создано автоматически со всеми внутренними полями, поэтому вам не обязательно создавать другой класс для вложения. Я думаю, что можно было бы сделать что-то похожее на принятый ответ, но вам придется вручную добавить все свойства при создании индекса.

Создание индекса и хранение файла pdf

var index = "my-application";
var node = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(node, defaultIndex: index);
var client = new ElasticClient(settings);

// Create the index, indicating that the contents of the internal "file" field 
// and the internal "title" field should be stored with position offsets to 
// allow highlighting.
client.CreateIndex(_index, c => c
    .AddMapping<Doc>(m => 
        m.Properties(ps => 
            ps.Attachment(a =>
                a.Name(o => o.File)
                    .FileField(t => t.Name("file")
                    .TermVector(TermVectorOption.WithPositionsOffsets)
                    .Store()
                ).TitleField(t => t                  
                 .Name("title")
                 .TermVector(TermVectorOption.WithPositionsOffsets)
                 .Store())
             )
        ).Properties(ps =>
            ps.String(s => 
                s.Name(o => o.Title)
            )
        )
    )
);

string path = @"path\to\sample1.pdf";

var doc = new Doc()
{
    Title = "Anything you want",
    File = Convert.ToBase64String(System.IO.File.ReadAllBytes(path))
};

client.Index(doc);

Поиск

var queryString = "something in your pdf";
var searchResults = _client.Search<Doc>(s => 
           s.Fields("file", "title")
            .Query(quer => quer.QueryString(x => x.Query(queryString)))
            .Highlight(x => 
                    x.OnFields(y => 
                        y.OnField(f => f.File)
                         .PreTags("<strong>")
                         .PostTags("</strong>")
            )
       )
   );
person Sam    schedule 12.08.2015