我的日志存储在ElasticSearch和一个使用C和Nest的Windows应用程序中,Nest正在对ElasticSearch执行搜索。ElasticSearch中的映射如下所示:
"mappings": {
"qns": {
"properties": {
"@timestamp": {
"format": "strict_date_optional_time||epoch_millis",
"type": "date"
},
"Error_Description": {
"index": "not_analyzed",
"type": "string"
},
"Thread_Id": {
"index": "not_analyzed",
"type": "string"
},
"Error_Description_Analyzed": {
"type": "string"
},
"Error_Source": {
"index": "not_analyzed",
"type": "string"
},
"record": {
"type": "string"
},
"@version": {
"type": "string"
},
"Log_Level": {
"type": "string"
},
"Record": {
"type": "string"
},
"id": {
"type": "long"
},
"Error_Source_Analyzed": {
"type": "string"
},
"Timestamp": {
"format": "strict_date_optional_time||epoch_millis",
"type": "date"
}
}
}
}
相应的C类如下:
[ElasticsearchType(IdProperty = "Id", Name = "qns")]
public class QNS
{
[Number(NumberType.Long, Name = "id")]
public long Id { get; set; }
[Date(Name = "Timestamp")]
public DateTime Timestamp { get; set; }
[String(Name = "Error_Description", Index = FieldIndexOption.NotAnalyzed)]
public string ErrorDescriptionKeyword { get; set; }
[String(Name = "Error_Description_Analyzed")]
public string ErrorDescriptionAnalyzed { get; set; }
[String(Name = "Error_Source", Index = FieldIndexOption.NotAnalyzed)]
public string ErrorSourceKeyword { get; set; }
[String(Name = "Error_Source_Analyzed")]
public string ErrorSourceAnalyzed { get; set; }
[String(Name = "Thread_Id", Index = FieldIndexOption.NotAnalyzed)]
public string ThreadId { get; set; }
[String(Name = "Log_Level")]
public string LogLevel { get; set; }
[String(Index = FieldIndexOption.NotAnalyzed)]
public string Record { get; set; }
}
我需要一种方法来搜索在datetime范围内并匹配特定模式范围的不同错误记录。虽然我能够得到结果,但我也得到了所有满足搜索的文档,而我只需要不同的错误字符串。对于Distinct查询,我使用FluentNest(https://github.com/hoonzis/fluentnest). 检索结果的代码如下:
private List<string> FindDistinctErrorsByPatternAndTimeRangeInternal(DateTime fromDateTime, DateTime toDateTime, List<pattern> patterns, string indexName, string type)
{
var documents = new List<QNS>();
var fromTime = fromDateTime.ToString(Constants.IndexSearch.ES_DATETIME_FORMAT);
var toTime = toDateTime.ToString(Constants.IndexSearch.ES_DATETIME_FORMAT);
var patternQueries = new List<QueryContainer>();
foreach (var p in patterns)
{
var pType = PatternType.unknown;
if (Enum.TryParse<PatternType>(p.Pattern_Type.ToLowerInvariant(), out pType))
{
switch (pType)
{
case PatternType.word:
patternQueries.Add(Query<QNS>.Regexp(r =>
r.Field(f =>
f.ErrorDescriptionAnalyzed)
.Value(p.Pattern_Description)
)
);
break;
case PatternType.phrase:
patternQueries.Add(Query<QNS>.MatchPhrase(m =>
m.Field(f =>
f.ErrorDescriptionAnalyzed)
.Query(p.Pattern_Description)
)
);
break;
case PatternType.unknown:
default:
break;
}
}
}
var datetimeQuery = Query<QNS>.QueryString(q =>
q.DefaultField(f =>
f.Timestamp).Query($"[{fromTime} TO {toTime}]")
);
var searchResults = client.Search<QNS>(s => s.Index(indexName)
.Type(type)
.Query(q =>
q.Filtered(f =>
f.Filter(fq =>
fq.Bool(b =>
b.MinimumShouldMatch(1).Should(patternQueries.ToArray())
)
)
.Query(qd =>
qd.Bool(b =>
b.Must(datetimeQuery)
)
)
)
)
.Sort(sort => sort.Ascending(SortSpecialField.DocumentIndexOrder))
.Aggregations(agg => agg.DistinctBy(q => q.ErrorDescriptionKeyword)));
var results = searchResults.Aggs.AsContainer<QNS>().GetDistinct(d => d.ErrorDescriptionKeyword);
return results.ToList();
}
我需要修改此代码以仅返回不同的错误字符串,而不是整个结果集。查询中的命中视频数约为3500,仅存在2个不同的错误字符串。因此,取回所有这些记录是没有意义的,因为我不打算使用它。有人能帮助我使用日期范围和模式正则表达式/短语匹配来获得正确的聚合查询,以便仅使用Nest或Nest/FluentNest返回不同的错误记录。
我想你正在寻找术语聚合。
但你的整个查询有点奇怪。您是否有一些遗留要求。
首先,您有两个字段ErrorDescriptionAnalyked和ErrorDescriptionKeyword您是否创建了一个不同的字段只是为了分析一个而不是一个?为什么不使用多字段
第二种过滤方法已经过时一段时间了。
这是一个快速示例,我希望能有所帮助
ElasticClient db = new ElasticClient(uri);
db.DeleteIndex(indexName);
var mappings = new CreateIndexDescriptor(indexName).Mappings(ms => ms.Map<A>(map => map.
AutoMap().
Properties(props =>
props.String(p =>
p.Name(a => a.Text).
Fields(fields =>
fields.String(pr => pr.Name("raw").NotAnalyzed()))))));
db.CreateIndex(mappings);
foreach (var item in Enumerable.Range(0, 10).Select(i => new A
{
Price1 = random.NextDouble() * 1000,
Date = i % 3 == 0 ? new DateTime(1900, 1, 1) : DateTime.Now,
Text = i % 2 == 0 ? "ABC" : "EFG"
}))
{
db.Index(item, inx => inx.Index(indexName));
}
var toDate = DateTime.Now + TimeSpan.FromDays(1);
var fromDate = DateTime.Now - TimeSpan.FromDays(30);
var data = db.Search<A>(s =>
s.Index(indexName)
.Query(q=>
q.DateRange(r => r.Field(f => f.Date).GreaterThan(fromDate).LessThanOrEquals(toDate))
&&
(
//term query is for finding words by default all words are lowercase but you can set a different analyzer
q.Term(t => t.Field(f => f.Text).Value("ABC".ToLower()))
||
//Raw field is not analysed so no need to lower case you can use you query here if you want
q.Term(t => t.Field("text.raw").Value("EFG"))
)
).Aggregations(aggr => aggr.Terms("distinct", aterm => aterm.Field("text.raw"))));
elasticsearch实例的一些背景: 一个节点,在一台机器上 特定索引由大小为1.23TB的26亿文档组成 索引被分成4个碎片。 堆大小设置为30 GB 服务器有256GB内存和40个内核。 Elasticsearch(版本1.4.3)是这个服务器上唯一运行的东西 我想返回所有具有特定名称的文档。属性名称已映射为: 我尝试过使用不同类型的搜索;过滤器、查询字符串、术语。结果都一样。当前查询如
我有三个索引,它们都共享一个特定的键值对。当我用api进行全面搜索时”http://localhost:9200/_search“使用请求正文 它只返回其中两个索引的结果。我尝试使用相同的请求正文,将url更改为仅在丢失的索引中搜索”http://localhost:9200/index_name/_search“这很管用。我有什么遗漏吗? 插入所有三个索引的代码遵循相同的过程,我使用elasti
问题内容: 我正在搜索索引中的文档,然后尝试通过获取其中的一些文档。尽管收到了一组结果,但是某些文档无法通过简单的get来检索。更糟糕的是,我可以通过URI搜索获得相同的文档,其中 例如,运行一个简单的GET 给我结果: 但是,如果我使用相同的_id进行搜索: 我得到了预期的结果: 我正在通过Stretcher ruby API索引文档,索引后立即进行刷新。我的本地设置是 2个节点 。我正在运
问题内容: 我开始四处寻找搜索引擎,经过一番阅读后,我决定使用ElasticSearch(这是非常了不起的:)),我的项目在C#中,所以我四处寻找客户端并开始使用NEST,一切都很简单,但是我搜索部分有些混乱。 我想搜索 特定类型的 所有字段 ,然后 输入 以下代码: 我看到许多字符串查询搜索已被弃用,并想确保上面的方法是正确的方式(上面未标记为已弃用…)对于一个简单的任务来说也有点长,所以也许有
我正在用Hibernate Search 4.5.1和Spring 4.0.5版本构建一个应用程序。我正在尝试索引以下类: 我正在构建一个junit测试用例,看起来如下所示: 我还注意到在luke lucene上,一些索引词的长度最多为6个字符,例如,一首歌的艺术家是“后代”,而索引中存储的词是“the”和“offspr”。第一个可以,但第二个不应该是“后代”。为什么要截断名字?
我使用Lucene.net3.0.3,我不明白停止词应该如何在查询中工作。 我将此文本作为输入: 我使用StandardAnalyzer(Version.LUCENE_30)进行索引和查询。索引有一个字段 该字段设置为存储和分析。我也玩过不同的TermVector。对于查询解析,我使用简单的QueryParser。解析和 这就是问题所在: 查询返回文档-这很好 对的查询不会返回文档-我期待它,因为