具有附件突出显示功能的Client.Net Nest

本文关键字:功能 Client Net Nest 显示 | 更新日期: 2023-09-27 18:22:19

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

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

一旦我尝试按关键字搜索,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" : {} 
    } 
  } 
} 

似乎在为类中的类型创建映射时,附件属性设置不正确:由于在检查时localhost:9200/myindex/mytype/mapping?漂亮的attachment属性没有Store=true,TermVector=TermVectorOption.WithPositionsOffsets

你有什么想法吗?感谢

具有附件突出显示功能的Client.Net Nest

尽管它确实让我走上了正确的方向,但我无法将其仅用于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>")
            )
       )
   );