我最近开始使用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
你有什么想法吗?感谢
尽管它确实让我走上了正确的方向,但我无法将其仅用于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 = @"pathtosample1.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>")
)
)
);