使用elasticsearch,angularjs键入时搜索

时间:2016-08-06 08:29:44

标签: angularjs elasticsearch n-gram

当我使用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命令的输出。我们如何将分析器与上面的工作代码混合。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您是否已将分析仪添加到弹性搜索映射中的字段名称,符号和行业?

curl -XPUT 'http://localhost:9200/index/type/_mapping?ignore_conflicts=true' -d'
{
    "type": {
        "properties": {
            "name": {
                "type":     "string",
                "analyzer": "autocomplete"
            }
        }
    }
}'

请务必使用ignore_conflicts = true。

如果您仍然遇到问题,那么您可能需要创建新索引,添加分析器并过滤设置,创建所需的映射,然后再次上传数据。