我正在尝试使用它来构建文本搜索,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}
});
这是我尝试使用的其余模型代码analyzer
和tokenizer
:
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);
});
})