0

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

当我写出存在于任何索引字段中的完整单词时,搜索工作正常,但是,我想做的是,例如,当我输入sam获取产品时samsung,我正在使用分词器,这会破坏许多词s sa sam sams等. 注意:我使用mongoosastic的是与Elasticsearch服务器一起工作的。这是产品模型,我称之为Item

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}
});

这是我尝试使用的其余模型代码analyzertokenizer

    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'}但是,该字段停止被索引以进行搜索。

搜索端点的代码:

 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);
    });
 })
4

1 回答 1

0

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

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部分并使其如下所示:

"analyzer":{
    "edge_nGram_analyzer": {
        "type":"custom",
        "tokenizer":"edge_ngram_tokenizer",
        "filter": [
           "lowercase",
           "asciifolding",
           "edgeNGram_filter"
        ]
     },
     ...
于 2015-08-11T03:33:03.403 回答