我最近开始使用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 为了它。
你有什么想法吗? 谢谢答案 0 :(得分:1)
我无法仅仅通过对GitHub问题的回应来解决这个问题,尽管它确实让我朝着正确的方向前进。经过一些试验和错误,这就是我想出的:
public class Doc
{
public string File { get; set; }
// As an example for including additional fields:
public string Title { get; set; }
}
将自动使用所有内部字段创建附件,因此您不一定需要为附件创建另一个类。我认为可以做一些与接受的答案类似的事情,但是你必须在创建索引时手动添加所有属性。
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>")
)
)
);