我正在尝试用Elasticsearch建立一个文本搜索,这是我第一次使用它,所以,我可能误解了许多概念。
当我在任何索引字段中输入完整的单词时,搜索效果很好,但是,我尝试做的是,例如,当我输入sam get the products of samsung时,我使用记号赋予器,它在许多s sa sam sams等中打断了这个词。注意:我正在使用mongoosastic与Elasticsearch服务器一起工作。这是products模型,我称之为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'},但是,然后字段停止索引以进行搜索。
搜索endPoint的代码如下:
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);
});
})发布于 2015-08-11 11:33:03
您需要为title字段指定要使用的分析器。现在,您只需为每个字段建立索引以进行搜索,但并没有将edge_nGram_analyzer应用于title字段。您可以使用mongoosastic es_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"
]
},
...https://stackoverflow.com/questions/31929005
复制相似问题