我想在内容字段上搜索并返回内容和文件名。下面的查询来自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结果,但是它的映射不正确。
我尝试使用Rootobject
,Hits
和Hit
类,但结果仅用于_source
的结果为:
var response = client.Search<_Source>(request);
var twet = response.Documents.Select(t => t.file.filename).ToList();
现在我可以检索content
和file name
,但是如果尝试使用以前的类。Hits
和hits.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();
使用Rootobject
,Hits
,Hit
类。虽然响应确实包含它。
所以我如何使用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();