我正在尝试查找索引中的所有关键字。 这是为了在输入时对单词进行自动完成。
但你会如何设置该过滤器?或者我是否需要将其与索引进行映射?
注意:我不想对文件的完整结果名称进行自动填充(因此,如果我存储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"
}
}
}
}
现在我需要弄清楚如何搜索这些条款