File.FileName在Nest弹性搜索查询中返回null



我想在内容字段上搜索并返回内容和文件名。下面的查询来自Nest GitHub页面

连接字符串:

var node = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(node);
var client = new ElasticClient(settings);

我的类:

下面的搜索类型类别(我觉得问题可能在这里(:

public class myclass
{
    public string Content { get; set; }
    public string filename { get; set; }
}

所以我只需要file.filename中的内容和文件名,但是在我的搜索中,它返回file.file.filename。但内容确实在同一查询中返回。

NEST API调用:

var request = new SearchRequest
{
    From = 0,
    Size = 10,
    Query = new TermQuery { Name="Web", Field = "content", Value = "findthis" }
};
var response = client.Search<myclass>(request);
var twet = response.Documents.Select(t=>t.Content).ToList();

我是弹性搜索的新手,所以无法理解。我什至不知道为什么我在Kibana中使用术语查询来搜索文档,我用户用户不同的查询以及非常可以理解的匹配和match_phrase查询。所以请帮助我获得file.filename

编辑:我也尝试包括此(后来删除(:

Source = new SourceFilter { Includes = ("file.filename") }

KIBANA调用:

这是Kibana Console的呼叫:

GET /extract/_search
{
   "from" : 0, "size" : 1
    , "query": {
            "match": {
                        "content": "findthis"
                     }
               }
}

呼叫返回以下结果我使用了1个结果来显示:

弹性搜索索引中的文档:

{
  "took": 322,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3330,
    "max_score": 4.693223,
    "hits": [
      {
        "_index": "extract",
        "_type": "doc",
        "_id": "29ebfd23bd7b276d7f3afc2bfad146d",
        "_score": 4.693223,
        "_source": {
          "content": """
                        my title
                        A looooong document text to findthis.
                    """,
          "meta": {
            "title": "my title",
            "raw": {
              "X-Parsed-By": "org.apache.tika.parser.DefaultParser",
              "Originator": "Microsoft Word 11",
              "dc:title": "my title",
              "Content-Encoding": "windows-1252",
              "Content-Type-Hint": "text/html; charset=windows-1252",
              "resourceName": "filename.htm",
              "ProgId": "Word.Document",
              "title": "my title",
              "Content-Type": "text/html; charset=windows-1252",
              "Generator": "Microsoft Word 11"
            }
          },
          "file": {
            "extension": "htm",
            "content_type": "text/html; charset=windows-1252",
            "last_modified": "2015-10-27T15:44:07.093+0000",
            "indexing_date": "2018-02-10T08:16:23.329+0000",
            "filesize": 32048,
            "filename": "filename.htm",
            "url": """file://D:tmppathtofilename.htm"""
          },
          "path": {
            "root": "e1a38f7da342f641e3eefad1ed1ca0f2",
            "virtual": "/path/to/filename.htm",
            "real": """D:tmppathtofilename.htm"""
          }
        }
      }
    ]
  }
}

我正在使用Nest API从同一服务器上的弹性搜索6获取文档file.filename

问题:

即使我在上面也提到过。问题是fileName在nest API中返回null,而内容确实返回。


解决方案1:使用settings.DisableDirectStreaming();我检索了JSON结果并创建了下类:

新类:

public class Rootobject
    {
        public int took { get; set; }
        public bool timed_out { get; set; }
        public _Shards _shards { get; set; }
        public Hits hits { get; set; }
    }
    public class _Shards
    {
        public int total { get; set; }
        public int successful { get; set; }
        public int skipped { get; set; }
        public int failed { get; set; }
    }
    public class Hits
    {
        public int total { get; set; }
        public float max_score { get; set; }
        public Hit[] hits { get; set; }
    }
    public class Hit
    {
        public string _index { get; set; }
        public string _type { get; set; }
        public string _id { get; set; }
        public float _score { get; set; }
        public _Source _source { get; set; }
    }
    public class _Source
    {
        public string content { get; set; }
        public Meta meta { get; set; }
        public File file { get; set; }
        public Path path { get; set; }
    }
    public class Meta
    {
        public string title { get; set; }
        public Raw raw { get; set; }
    }
    public class Raw
    {
        public string XParsedBy { get; set; }
        public string Originator { get; set; }
        public string dctitle { get; set; }
        public string ContentEncoding { get; set; }
        public string ContentTypeHint { get; set; }
        public string resourceName { get; set; }
        public string ProgId { get; set; }
        public string title { get; set; }
        public string ContentType { get; set; }
        public string Generator { get; set; }
    }
    public class File
    {
        public string extension { get; set; }
        public string content_type { get; set; }
        public DateTime last_modified { get; set; }
        public DateTime indexing_date { get; set; }
        public int filesize { get; set; }
        public string filename { get; set; }
        public string url { get; set; }
    }
    public class Path
    {
        public string root { get; set; }
        public string _virtual { get; set; }
        public string real { get; set; }
    }

查询:我使用MatchQuery而不是TermQuery,这是我的查询,连接字符串如上所述:

 var request = new SearchRequest
 {
     From = 0,
     Size = 1,
     Query = new MatchQuery { Field = "content", Query = txtsearch.Text }
 };

新问题:我尝试了很多,尽管响应确实包含了整个JSON结果,但是它的映射不正确。

我尝试使用RootobjectHitsHit类,但结果仅用于_source的结果为:

var response = client.Search<_Source>(request);
var twet = response.Documents.Select(t => t.file.filename).ToList();

现在我可以检索contentfile name,但是如果尝试使用以前的类。Hitshits.total作为null返回。

我尝试了以下查询:

var twet = response.Documents.SelectMany(t => t.hits.hits.Select(k => k._source.content)).ToList();

var twet1 = response.Hits.SelectMany(t => t.Source.hits.hits.Select(k => k._source.content)).ToList();

var twet1 = response.Documents.Select(t => t.Filename.fileName).ToList();

var twet = response.HitsMetadata.Hits.Select(t => t.Source.filename).ToList();

使用RootobjectHitsHit类。虽然响应确实包含它。

所以我如何使用Rootobject类,以便我可以得到任何想要的东西。

弹性搜索服务器返回响应作为JSON字符串,然后将其置于您所需的类中。

在您的情况下,文件名是文件属性内的嵌套属性。为了进行嵌套的JSON属性检查此链接如何从JSON中使用JSON.NET访问C#

中的JSON对象。
public class MyClass
{
    public string Content { get; set; }
    public FileClass File { get; set; }
}
public class Fileclass
{
    public string Filename { get; set; }
}

,然后您可以读取response.Documents.Select(t=>t.File.Filename).ToList();

的文件名

相关内容

  • 没有找到相关文章

最新更新