首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js + Elasticsearch:当应用搜索查询时,分析器不工作

问Node.js + Elasticsearch:当应用搜索查询时,分析器不工作
EN

Stack Overflow用户
提问于 2015-08-11 04:56:23
回答 1查看 954关注 0票数 0

我正在尝试用Elasticsearch建立一个文本搜索,这是我第一次使用它,所以,我可能误解了许多概念。

当我在任何索引字段中输入完整的单词时,搜索效果很好,但是,我尝试做的是,例如,当我输入sam get the products of samsung时,我使用记号赋予器,它在许多s sa sam sams等中打断了这个词。注意:我正在使用mongoosastic与Elasticsearch服务器一起工作。这是products模型,我称之为Item:

代码语言:javascript
复制
var ItemSchema = new mongoose.Schema({
    title: {type: String, es_indexed:true, es_analyzer: 'edge_nGram_analyzer'},
    price: Number,
    description: {type: String, es_indexed:true},
    picture: String,
    vendor: {type: String, es_indexed:true},
    vendorId: {type:String, es_indexed:true}
});

下面是我尝试使用analyzer和tokenizer的其余模型代码

代码语言:javascript
复制
    ItemSchema.plugin(mongoosastic, {
        hosts: [
        'localhost:9200'
        ]
    });

    var Item = mongoose.model('Item', ItemSchema);

    Item.createMapping({
"analysis" : {
    "filter": {
        "edgeNGram_filter": {
           "type": "edgeNGram",
           "min_gram": 2,
           "max_gram": 20,
           "side" : "front"
        }
     },
    "analyzer":{
        "edge_nGram_analyzer": {
            "type":"custom",
            "tokenizer":"edge_ngram_tokenizer",
            "filter": [
              "lowercase",
              "asciifolding",
              "edgeNGram_filter"
            ]
        },
        "whitespace_analyzer": {
            "type": "custom",
            "tokenizer": "whitespace",
            "filter": [
              "lowercase",
              "asciifolding"
           ]    
        }
    },
    "tokenizer" : {
        "edge_ngram_tokenizer" : {
          "type" : "edgeNGram",
          "min_gram" : "2",
          "max_gram" : "5",
          "token_chars": [ "letter", "digit" ]
        }   
    }
  }
    },function(err, mapping){
      // do neat things here
      if(err) {
        console.log(err);
      } 
      console.log(mapping);
    });

    module.exports = Item;

我测试了Item (产品)是否有title : cupcake,如果我在搜索框中输入cup,我什么也得不到,但是,如果我写完整的关键字,我就会得到对象。

我也不想分析供应商ID和描述,我试着这样做:vendorId: {type:String, index: 'not_analyzed'},但是,然后字段停止索引以进行搜索。

搜索endPoint的代码如下:

代码语言:javascript
复制
 app.post('/api/search', function(req, res, next) {
    Item.search({
      query_string: {
        query: req.body.keyword
      }
    },{hydrate:true}, function(err, results) {
      // results here
      res.send(results);
    });
 })
EN

回答 1

Stack Overflow用户

发布于 2015-08-11 11:33:03

您需要为title字段指定要使用的分析器。现在,您只需为每个字段建立索引以进行搜索,但并没有将edge_nGram_analyzer应用于title字段。您可以使用mongoosastic es_analyzer属性来实现它,如下所示:

代码语言:javascript
复制
var ItemSchema = new mongoose.Schema({
    title: {type: String, es_indexed:true, es_analyzer: 'edge_nGram_analyzer'},
    price: Number,
    description: {type: String, es_indexed:true},
    picture: String,
    vendor: {type: String, es_indexed:true},
    vendorId: {type:String, es_indexed:true}
});

不过,在您的代码中还有另一个问题,即没有正确指定edge_nGram_analyzer,您应该删除content部件,并使其如下所示:

代码语言:javascript
复制
"analyzer":{
    "edge_nGram_analyzer": {
        "type":"custom",
        "tokenizer":"edge_ngram_tokenizer",
        "filter": [
           "lowercase",
           "asciifolding",
           "edgeNGram_filter"
        ]
     },
     ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31929005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档