当我使用angularjs和弹性搜索键入功能时,我正在进行搜索。我将$ viewValue传递给以角度编写的工厂,并从angular中获取数据。请检查下面的代码。
services.factory('instantSearch',['$q', 'esFactory', '$location', function($q, elasticsearch, $location){
return{
instantResult : function(term){
var client = elasticsearch({
// host: $location.host() + ':9200'
host: 'localhost:9200'
});
var deferred = $q.defer();
client.search({
"index": 'stocks',
"type": 'stock',
"body": {
"from" : 0, "size" : 20,
"query": {
"bool":{
"should":[
{
"match_phrase":{
"name": term
}
},
{
"match_phrase":{
"symbol": term
}
},
{
"match":{
"industry": term
}
}
]
}
}
}
}).then(function(result) {
var hits = result.hits.hits;
deferred.resolve(hits);
},
function (err) {
console.trace(err.message);
}, deferred.reject);
return deferred.promise;
}
};
}]);
这段代码运行正常,但问题是当输入匹配elasticsearch索引字段中的完整术语时,我得到结果。所以我想实现与令牌匹配的令牌分析器(ngram - 1,2,3)并提供每个角色打字的结果。
因此,要添加分析器代码,我们必须在te elasticserach索引中添加设置,如下所示:
"settings": {
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
}
但是我没有在这里传递参数的方法。我检查的每个例子都显示了curl命令的输出。我们如何将分析器与上面的工作代码混合。
感谢您的帮助。
答案 0 :(得分:0)
您是否已将分析仪添加到弹性搜索映射中的字段名称,符号和行业?
curl -XPUT 'http://localhost:9200/index/type/_mapping?ignore_conflicts=true' -d'
{
"type": {
"properties": {
"name": {
"type": "string",
"analyzer": "autocomplete"
}
}
}
}'
请务必使用ignore_conflicts = true。
如果您仍然遇到问题,那么您可能需要创建新索引,添加分析器并过滤设置,创建所需的映射,然后再次上传数据。