使用 Nest Elasticsearch 的文档的术语频率
term frequency of documents with Nest Elasticsearch
我是 elasticsearch 的新手,想使用 Nest elasticsearch 获取特定文档的 "content" 字段的前 N 个词频。我进行了很多搜索以找到适合我的正确答案,但我只是知道我应该使用 Terms vector 而不是 Term Facet,因为它会计算整个文档集中的术语。我知道我应该像下面那样为 Term Vector 做一些设置;
[ElasticProperty(Type = Nest.FieldType.attachment, TermVector =Nest.TermVectorOption.with_positions_offsets, Store = true)]
public Attachment File { get; set; }
我经常使用 Nest Elasticsearch 搜索获取特定文档的词频,但我发现的都是关于 Lucene 和 Solr 的。
我需要 Nest elasticsearch 中的示例。我感谢您的帮助。
还有一个问题;实际上,当我想获取文档标题等字符串的词频时,该解决方案(由 Rob 建议)效果很好。但是当我将目标字段更改为文档的内容时,我没有得到任何结果!为了能够搜索文档的内容,我遵循了这个 link: ElasticSearch & attachment type (NEST C#) 中的答案并且它工作正常,我可以通过文档的内容搜索一个术语但是为了获得 TF这是行不通的;下面是它的代码;
var searchResults = client.TermVector<Document>(t =>t.Id(ID).TermStatistics().Fields(f => f.File));
有人有解决办法吗?
您可以通过 client.TermVector(..)
完成此操作。这是一个简单的例子:
文档 class:
public class MyDocument
{
public int Id { get; set; }
[ElasticProperty(TermVector = TermVectorOption.WithPositionsOffsets)]
public string Description { get; set; }
[ElasticProperty(Type = FieldType.Attachment, TermVector =TermVectorOption.WithPositionsOffsetsPayloads, Store = true, Index = FieldIndexOption.Analyzed)]
public Attachment File { get; set; }
}
索引一些测试数据:
var indicesOperationResponse = client.CreateIndex(indexName, c => c
.AddMapping<MyDocument>(m => m.MapFromAttributes()));
var myDocument = new MyDocument {Id = 1, Description = "test cat test"};
client.Index(myDocument);
client.Index(new MyDocument {Id = 2, Description = "river"});
client.Index(new MyDocument {Id = 3, Description = "test"});
client.Index(new MyDocument {Id = 4, Description = "river"});
client.Refresh();
通过 NEST 检索术语统计信息:
var termVectorResponse = client.TermVector<MyDocument>(t => t
.Document(myDocument)
//.Id(1) //you can specify document by id as well
.TermStatistics()
.Fields(f => f.Description));
foreach (var item in termVectorResponse.TermVectors)
{
Console.WriteLine("Field: {0}", item.Key);
var topTerms = item.Value.Terms.OrderByDescending(x => x.Value.TotalTermFrequency).Take(10);
foreach (var term in topTerms)
{
Console.WriteLine("{0}: {1}", term.Key, term.Value.TermFrequency);
}
}
输出:
Field: description
cat: 1
test: 2
希望对您有所帮助。
更新
当我检查索引的映射时,有一件事很有趣:
{
"my_index" : {
"mappings" : {
"mydocument" : {
"properties" : {
"file" : {
"type" : "attachment",
"path" : "full",
"fields" : {
"file" : {
"type" : "string"
},
"author" : {
"type" : "string"
},
"title" : {
"type" : "string"
},
"name" : {
"type" : "string"
},
"date" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"keywords" : {
"type" : "string"
},
"content_type" : {
"type" : "string"
},
"content_length" : {
"type" : "integer"
},
"language" : {
"type" : "string"
}
}
},
"id" : {
"type" : "integer"
}
}
}
}
}
}
没有关于术语向量的信息。
当我通过sense创建索引后:
PUT http://localhost:9200/my_index/mydocument/_mapping
{
"mydocument": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"term_vector":"with_positions_offsets",
"store": true
}
}
}
}
}
}
我能够检索术语统计信息。
希望我稍后会带着通过 NEST 创建的工作映射回来。
UPDATE2
基于 Greg's answer 试试这个流畅的映射:
var indicesOperationResponse = client.CreateIndex(indexName, c => c
.AddMapping<MyDocument>(m => m
.MapFromAttributes()
.Properties(ps => ps
.Attachment(s => s.Name(p => p.File)
.FileField(ff => ff.Name(f => f.File).TermVector(TermVectorOption.WithPositionsOffsets)))))
);
我是 elasticsearch 的新手,想使用 Nest elasticsearch 获取特定文档的 "content" 字段的前 N 个词频。我进行了很多搜索以找到适合我的正确答案,但我只是知道我应该使用 Terms vector 而不是 Term Facet,因为它会计算整个文档集中的术语。我知道我应该像下面那样为 Term Vector 做一些设置;
[ElasticProperty(Type = Nest.FieldType.attachment, TermVector =Nest.TermVectorOption.with_positions_offsets, Store = true)]
public Attachment File { get; set; }
我经常使用 Nest Elasticsearch 搜索获取特定文档的词频,但我发现的都是关于 Lucene 和 Solr 的。 我需要 Nest elasticsearch 中的示例。我感谢您的帮助。
还有一个问题;实际上,当我想获取文档标题等字符串的词频时,该解决方案(由 Rob 建议)效果很好。但是当我将目标字段更改为文档的内容时,我没有得到任何结果!为了能够搜索文档的内容,我遵循了这个 link: ElasticSearch & attachment type (NEST C#) 中的答案并且它工作正常,我可以通过文档的内容搜索一个术语但是为了获得 TF这是行不通的;下面是它的代码;
var searchResults = client.TermVector<Document>(t =>t.Id(ID).TermStatistics().Fields(f => f.File));
有人有解决办法吗?
您可以通过 client.TermVector(..)
完成此操作。这是一个简单的例子:
文档 class:
public class MyDocument
{
public int Id { get; set; }
[ElasticProperty(TermVector = TermVectorOption.WithPositionsOffsets)]
public string Description { get; set; }
[ElasticProperty(Type = FieldType.Attachment, TermVector =TermVectorOption.WithPositionsOffsetsPayloads, Store = true, Index = FieldIndexOption.Analyzed)]
public Attachment File { get; set; }
}
索引一些测试数据:
var indicesOperationResponse = client.CreateIndex(indexName, c => c
.AddMapping<MyDocument>(m => m.MapFromAttributes()));
var myDocument = new MyDocument {Id = 1, Description = "test cat test"};
client.Index(myDocument);
client.Index(new MyDocument {Id = 2, Description = "river"});
client.Index(new MyDocument {Id = 3, Description = "test"});
client.Index(new MyDocument {Id = 4, Description = "river"});
client.Refresh();
通过 NEST 检索术语统计信息:
var termVectorResponse = client.TermVector<MyDocument>(t => t
.Document(myDocument)
//.Id(1) //you can specify document by id as well
.TermStatistics()
.Fields(f => f.Description));
foreach (var item in termVectorResponse.TermVectors)
{
Console.WriteLine("Field: {0}", item.Key);
var topTerms = item.Value.Terms.OrderByDescending(x => x.Value.TotalTermFrequency).Take(10);
foreach (var term in topTerms)
{
Console.WriteLine("{0}: {1}", term.Key, term.Value.TermFrequency);
}
}
输出:
Field: description
cat: 1
test: 2
希望对您有所帮助。
更新
当我检查索引的映射时,有一件事很有趣:
{
"my_index" : {
"mappings" : {
"mydocument" : {
"properties" : {
"file" : {
"type" : "attachment",
"path" : "full",
"fields" : {
"file" : {
"type" : "string"
},
"author" : {
"type" : "string"
},
"title" : {
"type" : "string"
},
"name" : {
"type" : "string"
},
"date" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"keywords" : {
"type" : "string"
},
"content_type" : {
"type" : "string"
},
"content_length" : {
"type" : "integer"
},
"language" : {
"type" : "string"
}
}
},
"id" : {
"type" : "integer"
}
}
}
}
}
}
没有关于术语向量的信息。
当我通过sense创建索引后:
PUT http://localhost:9200/my_index/mydocument/_mapping
{
"mydocument": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"term_vector":"with_positions_offsets",
"store": true
}
}
}
}
}
}
我能够检索术语统计信息。
希望我稍后会带着通过 NEST 创建的工作映射回来。
UPDATE2
基于 Greg's answer 试试这个流畅的映射:
var indicesOperationResponse = client.CreateIndex(indexName, c => c
.AddMapping<MyDocument>(m => m
.MapFromAttributes()
.Properties(ps => ps
.Attachment(s => s.Name(p => p.File)
.FileField(ff => ff.Name(f => f.File).TermVector(TermVectorOption.WithPositionsOffsets)))))
);