我正在尝试查找索引中的所有关键字。这是为了在键入时对单词进行自动完成。
但是您将如何设置该过滤器?还是我需要将其与索引映射?
注意:我不想在文件完整结果名称上自动完成(所以如果我存储)结果that big brown fox is dead
可能是big
、brown
和)fox
dead
例如,我fox
索引的单词越多,它的分数就越高
当您键入时,我对整个单词有一个完整的自动完成功能(所以这不是我要找的):
that big brown fox is dead
当我键入时,这会给我fo
。而不仅仅是fox
var c = new ElasticClient();
var results = c.Search<dm_document>(s => s
.From(from)
.Size(size)
.Index("testindex")
.Query(q => q.Term(d => d.object_name.Suffix("autocomplete"), search))
);
return results.Documents.Select(d => new { d.object_name, d.r_object_id }).ToList();
使用以下索引设置
var createResult = client.CreateIndex("testindex", index => index
.Analysis(analysis => analysis
.Analyzers(a => a
.Add(
"autocomplete",
new Nest.CustomAnalyzer() {
Tokenizer = "edgeNGram",
Filter = new string[] { "lowercase" }
}
)
)
.Tokenizers(t => t
.Add(
"edgeNGram",
new Nest.EdgeNGramTokenizer() {
MinGram = 1,
MaxGram = 20
}
)
)
)
.AddMapping<dm_document>(tmd => tmd
.Properties(props => props
.MultiField(p => p
.Name(t => t.object_name)
.Fields(tf => tf
.String(s => s
.Name(t => t.object_name)
.Index(Nest.FieldIndexOption.NotAnalyzed)
)
.String(s => s
.Name(t => t.object_name.Suffix("autocomplete"))
.Index(Nest.FieldIndexOption.Analyzed)
.IndexAnalyzer("autocomplete")
)
.String(s => s
.Name(t => t.title)
.Index(Nest.FieldIndexOption.NotAnalyzed)
)
.String(s => s
.Name(t => t.title.Suffix("autocomplete"))
.Index(Nest.FieldIndexOption.Analyzed)
.IndexAnalyzer("autocomplete")
)
.String(s => s
.Name(t => t.text)
.Index(Nest.FieldIndexOption.Analyzed)
.IndexAnalyzer("snowball")
)
.String(s => s
.IndexName("tag")
.Name("keywords_test")
.IndexAnalyzer("keywords")
)
)
)
)
)
);
但这会导致对象的全名,我只想要关键字
更新:找到了如何获得条款,不确定这个结果是否是我需要的,但它已经给了我条款
POST _search
{
"query" : { "query_string" : {"query" : "*"} },
"facets": {
"tags": {
"terms": {
"field": "title"
}
}
}
}
现在我需要弄清楚如何搜索这些术语