客户端.Net Nest具有附件突出显示功能

时间:2014-09-18 16:01:09

标签: c# windows elasticsearch nest

我最近开始使用Elastic Search及其.net客户端NEST。 要问很多问题。

我在尝试使用elasticsearch-mapper-attachments插件突出显示附件字段中的搜索结果时被阻止。 索引工作正常,映射似乎正确,编码和解码也很好,

一旦我尝试按关键字搜索,ES似乎能够找到包含关键字的正确文档,但在突出显示结果中,它不显示已解码的文本,而是显示任何内容,或编码的文本。

从处理某些相同功能的其他帖子中读取,解决方案是设置store = yes,以及TermVector = TermVectorOption.WithPositionsOffsets。

所以我尝试使用

在我的C#类文件中配置它
[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" : {} 
    } 
  } 
} 

在为类中的类型创建映射时似乎未正确设置附件属性: 因为在检查时 本地主机:9200 / myindex / MYTYPE / _mapping漂亮 attachment属性没有 商店= TRUE, TermVector = TermVectorOption.WithPositionsOffsets 为了它。

你有什么想法吗? 谢谢

1 个答案:

答案 0 :(得分:1)

我无法仅仅通过对GitHub问题的回应来解决这个问题,尽管它确实让我朝着正确的方向前进。经过一些试验和错误,这就是我想出的:

Doc类

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