我正在使用ElasticSearch构建自动完成功能.当用户输入时,我想显示数据的完成列表,因此用户可以选择一个.例如,如果数据包含以下短语:
very unusual
very unlikely
very useful
Run Code Online (Sandbox Code Playgroud)
和用户类型:
very u
Run Code Online (Sandbox Code Playgroud)
我想显示上面的短语.
我正在使用此查询:
"query": {
"multi_match": {
"query": "very u",
"fields": [
"name",
"description",
"contentBlocks.caption",
"contentBlocks.text"
],
"type": "phrase_prefix",
"max_expansions": 10,
"cutoff_frequency": 0.001
}
Run Code Online (Sandbox Code Playgroud)
这与我正在寻找的内容相匹配,但从搜索结果中提取匹配的短语非常尴尬.我一直在使用突出显示,我通过解析突出显示来收集匹配的短语.例如:
"highlight": {
"contentBlocks.text": [
"turned the <em>very</em> <em>unusual</em> doorknob"
]
}
"highlight": {
"contentBlocks.text": [
"invented a <em>very</em> <em>useful</em> mechanism"
]
}
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
"Phrase Suggester"可能能够完成我所描述的内容,但你怎么做到这一点并不明显.
我已将感兴趣的字段(例如"描述")编入索引,如下所示:
"description" : {
"index_analyzer" : "snowball_stem",
"search_analyzer" : "snowball_stem",
"type" : "string",
"fields" : {
"autocomplete" : {
"index_analyzer" : …Run Code Online (Sandbox Code Playgroud) 我们的数据存储在MongoDB 2.4.8中,并使用ElasticSearch MongoDB River 1.7.3索引到ElasticSearch 0.90.7.
我们的数据索引正确,我可以成功搜索我们想要搜索的字段.但我还需要过滤权限 - 当然我们只想返回调用用户实际可以读取的结果.
在我们服务器上的代码中,我将调用用户的授权作为数组,例如:
[ "Role:REGISTERED_USER", "Account:52c74b25da06f102c90d52f4", "Role:USER", "Group:52cb057cda06ca463e78f0d7" ]
Run Code Online (Sandbox Code Playgroud)
我们正在搜索的单位数据的示例如下:
{
"_id" : ObjectId("52dffbd6da06422559386f7d"),
"content" : "various stuff",
"ownerId" : ObjectId("52d96bfada0695fcbdb41daf"),
"acls" : [
{
"accessMap" : {},
"sourceClass" : "com.bulb.learn.domain.units.PublishedPageUnit",
"sourceId" : ObjectId("52dffbd6da06422559386f7d")
},
{
"accessMap" : {
"Role:USER" : {
"allow" : [
"READ"
]
},
"Account:52d96bfada0695fcbdb41daf" : {
"allow" : [
"CREATE",
"READ",
"UPDATE",
"DELETE",
"GRANT"
]
}
},
"sourceClass" : "com.bulb.learn.domain.units.CompositeUnit",
"sourceId" : ObjectId("52dffb54da06422559386f57")
}
]
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例数据中,我已将所有可搜索的内容替换为
"content" …