我正在使用NEST的对象初始化器语法来形成搜索查询。当我使用逻辑OR运算符包含第二个pdfQuery时,我得不到任何结果。如果我将其排除,我会得到结果。
QueryContainer titleQuery = new MatchQuery
{
Field = Property.Path<ElasticBook>(p => p.Title),
Query = query,
Boost = 50,
Slop = 2,
MinimumShouldMatch = "55%"
};
QueryContainer pdfQuery = new MatchQuery
{
Field = Property.Path<ElasticBook>(p => p.Pdf),
Query = query,
CutoffFrequency = 0.001
};
var result = _client.Search<ElasticBook>(new SearchRequest("bookswithstop", "en")
{
From = 0,
Size = 10,
Query = titleQuery || pdfQuery,
Timeout = "20000",
Fields = new []
{
Property.Path<ElasticBook>(p => p.Title)
}
});
如果我调试并检查结果var,我将其中一个请求属性复制到get:
{
"timeout": "20000",
"from": 0,
"size": 10,
"fields": [
"title"
],
"query": {
"bool": {
"should": [
{
"match": {
"title": {
"query": "Proper Guide To Excel 2010",
"slop": 2,
"boost": 50.0,
"minimum_should_match": "55%"
}
}
},
{
"match": {
"pdf": {
"query": "Proper Guide To Excel 2010",
"cutoff_frequency": 0.001
}
}
}
]
}
}
}
问题在于,如果我将该查询复制到意义上 - 它会返回大约100个结果(虽然很慢)。我已经检查了标题信息,这似乎也是正确的NEST:
ConnectionStatus = {StatusCode: 200,
Method: POST,
Url: http://elasticsearch-blablablamrfreeman/bookswithstop/en/_search,
Request: {
"timeout": "20000",
"from": 0,
"size": 10,
"fields": [
"title"
],
"query": {
"bool": {
"shoul...
pdf字段使用弹性搜索附件插件(位于@ https://github.com/elastic/elasticsearch-mapper-attachments
),之前我被抛出Newtonsoft.JSON system.outofmemoryexceptions
(但由于某种原因现在没有)。
我唯一的建议是,通过我的查询和NEST可能存在一些序列化问题?如果是这种情况,我不确定为什么它只能用200代码成功执行并在Documents属性中提供0个文档
有人可以向我解释一下我将如何解决这个问题吗?它显然不喜欢我的第二个搜索查询(pdfQuery),但我不确定为什么 - 并且结果JSON请求语法似乎也是正确的!
答案 0 :(得分:1)
我认为这部分导致了问题
Fields = new []
{
Property.Path<ElasticBook>(p => p.Title)
}
您何时使用Fields选项,弹性搜索不返回_source
字段,因此您无法通过result.Documents
访问结果。相反,你必须使用result.FieldSelections
,这是非常不愉快的。
如果您只想返回elasticsearch中的特定字段,并且仍然可以使用result.Documents
,则可以利用source includes / excludes。使用NEST,您可以执行以下操作:
var searchResponse = client.Search<Document>(s => s
.Source(source => source.Include(f => f.Number))
.Query(q => q.MatchAll()));
希望这会对你有所帮助。