gpt4 book ai didi

elasticsearch - 在NEST Elasticsearch 查询中,file.filename返回null

转载 作者:行者123 更新时间:2023-12-03 00:53:36 24 4
gpt4 key购买 nike

我想搜索内容字段并返回内容和文件名。下面的查询取自NEST github page

连接字符串:

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

我的类(class):

搜索类型的类别如下(我觉得问题可能在这里):
public class myclass
{
public string Content { get; set; }
public string filename { get; set; }
}

因此,我只需要file.filename中的内容和文件名,但是在我的搜索中,file.filename返回null,但是内容在同一查询中返回。

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

由于我是 flex 搜索的新手,所以无法理解它。我什至不知道为什么我要使用术语查询来搜索文档,而在kibana中我使用不同的查询以及相当容易理解的match和match_phrase查询。因此,请帮助我获取 file.filename

编辑:我也试图包括此(后来删除):
Source = new SourceFilter { Includes = ("file.filename") }

KIBANA电话:

这是来自kibana控制台的调用:
GET /extract/_search
{
"from" : 0, "size" : 1
, "query": {
"match": {
"content": "findthis"
}
}
}

调用返回以下结果,我已使用1个结果在此处显示:

flex 搜索索引中的 文档:
{
"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:\tmp\path\to\filename.htm"""
},
"path": {
"root": "e1a38f7da342f641e3eefad1ed1ca0f2",
"virtual": "/path/to/filename.htm",
"real": """D:\tmp\path\to\filename.htm"""
}
}
}
]
}
}

我正在使用NEST Api从同一服务器上的 flex 搜索6获取文档 file.filename

问题:

即使我上面也提到过。问题是在内容返回时,NEST API中的文件名返回null。

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

新类(class):
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; }
}

查询:
我使用 TermQuery代替 MatchQuery,这是我的查询,连接字符串如上所述:
 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类来获取所需的任何东西。

最佳答案

flex 搜索服务器将响应作为JSON字符串返回,然后Nest将其反序列化为所需的类。

在您的情况下,文件名是文件属性内的嵌套属性。要反序列化嵌套的JSON属性,请检查此链接How to access nested object from JSON with Json.NET in C#

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

关于elasticsearch - 在NEST Elasticsearch 查询中,file.filename返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48839193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com