【问题标题】:term frequency of documents with Nest ElasticsearchNest Elasticsearch 文档的词频
【发布时间】:2015-09-13 05:59:13
【问题描述】:

我是 elasticsearch 新手,想使用 Nest elasticsearch 获取特定文档“内容”字段的前 N ​​个词频。我进行了很多搜索以找到适合我的正确答案,但我只是知道我应该使用术语向量而不是 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 建议)效果很好。但是当我将目标字段更改为文档的内容时,我没有返回任何结果!为了能够搜索文档的内容,我按照此链接中的答案进行操作:ElasticSearch & attachment type (NEST C#),它工作正常,我可以通过文档的内容搜索一个术语,但为了获取 TF,它不起作用;下面是它的代码;

var searchResults = client.TermVector<Document>(t =>t.Id(ID).TermStatistics().Fields(f => f.File));    

有人有解决办法吗?

【问题讨论】:

    标签: c# elasticsearch nest word-frequency


    【解决方案1】:

    您可以通过client.TermVector(..) 执行此操作。这是一个简单的例子:

    文档类:

    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"
                        }
                    }
                }
            }
        }
    }
    

    没有关于词向量的信息。

    当我通过感觉创建索引时:

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

    【讨论】:

    • 非常感谢罗伯!只是一个问题:虽然我想添加 client.TermVector,但安装的 Nest/elasticsearch 不知道这里的 TermVector。应该使用哪个命名空间或您使用的是哪个版本的 Nest?
    • @Mahsa 我使用的是 1.5.1。
    • 嗨 Rob,我在上面的问题中添加了第二部分。如果您对此有任何想法,请告诉我。谢谢。
    • 谢谢 Rob,它工作正常。但另一个问题是我想获得“前 N 个最常见的术语”。是否有任何 Ordering 属性来设置要检索的值 Descending 之类的?
    • @Mahsa 当然,检查我更新的示例(通过 NEST 检索术语统计信息)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多