Как повысить производительность в FTS?
Мне нужен совет, чтобы повысить эффективность поиска. Напишите сейчас, я разрабатываю бэкэнд-сервис с node.js и couchbase. Мое определение индекса следующее:
{"name": "product_search",
"type": "fulltext-index",
"params": {
"doc_config": {
"docid_prefix_delim": "",
"docid_regexp": "",
"mode": "type_field",
"type_field": "_type"
},
"mapping": {
"default_analyzer": "standard",
"default_datetime_parser": "dateTimeOptional",
"default_field": "_all",
"default_mapping": {
"default_analyzer": "",
"dynamic": true,
"enabled": false
},
"default_type": "_default",
"docvalues_dynamic": true,
"index_dynamic": true,
"store_dynamic": false,
"type_field": "_type",
"types": {
"Product": {
"default_analyzer": "",
"dynamic": false,
"enabled": true,
"properties": {
"categories": {
"default_analyzer": "",
"dynamic": true,
"enabled": true,
"properties": {
"\"$ref\"": {
"enabled": true,
"dynamic": false,
"fields": [
{
"analyzer": "keyword",
"index": true,
"name": "\"$ref\"",
"type": "text"
}
]
}
}
},
"description": {
"default_analyzer": "",
"dynamic": false,
"enabled": true,
"properties": {
"long": {
"enabled": true,
"dynamic": false,
"fields": [
{
"include_in_all": true,
"index": true,
"name": "long",
"type": "text"
}
]
},
"short": {
"enabled": true,
"dynamic": false,
"fields": [
{
"include_in_all": true,
"index": true,
"name": "short",
"type": "text"
}
]
}
}
},
"isVisible": {
"enabled": true,
"dynamic": false,
"fields": [
{
"include_term_vectors": true,
"index": true,
"name": "isVisible",
"type": "boolean"
}
]
},
"brandName": {
"enabled": true,
"dynamic": false,
"fields": [
{
"include_in_all": true,
"index": true,
"name": "brandName",
"type": "text"
}
]
},
"fobPriceMax": {
"enabled": true,
"dynamic": false,
"fields": [
{
"name": "fobPriceMax",
"store": true,
"type": "text"
}
]
},
"fobPriceMin": {
"enabled": true,
"dynamic": false,
"fields": [
{
"name": "fobPriceMin",
"store": true,
"type": "text"
}
]
},
"fobUnit": {
"enabled": true,
"dynamic": false,
"fields": [
{
"name": "fobUnit",
"store": true,
"type": "text"
}
]
},
"isActive": {
"enabled": true,
"dynamic": false,
"fields": [
{
"include_term_vectors": true,
"index": true,
"name": "isActive",
"type": "boolean"
}
]
},
"fobCurrency": {
"enabled": true,
"dynamic": false,
"fields": [
{
"name": "fobCurrency",
"store": true,
"type": "text"
}
]
},
"keywords": {
"enabled": true,
"dynamic": false,
"fields": [
{
"analyzer": "keyword",
"include_in_all": true,
"index": true,
"name": "keywords",
"type": "text"
}
]
},
"mainPicture": {
"enabled": true,
"dynamic": false,
"fields": [
{
"name": "mainPicture",
"store": true,
"type": "text"
}
]
},
"minOrderQuan": {
"enabled": true,
"dynamic": false,
"fields": [
{
"name": "minOrderQuan",
"store": true,
"type": "text"
}
]
},
"minOrderUnit": {
"enabled": true,
"dynamic": false,
"fields": [
{
"name": "minOrderUnit",
"store": true,
"type": "text"
}
]
},
"name": {
"enabled": true,
"dynamic": false,
"fields": [
{
"include_in_all": true,
"index": true,
"name": "name",
"store": true,
"type": "text"
}
]
},
"variationSerials": {
"enabled": true,
"dynamic": false,
"fields": [
{
"analyzer": "keyword",
"index": true,
"name": "variationSerials",
"type": "text"
}
]
}
}
}
}
},
"store": {
"indexType": "scorch",
"kvStoreName": "mossStore"
}
},
"sourceType": "couchbase",
"sourceName": "PTTTradeTest",
"sourceUUID": "7028f16e80f993f5d5f60c93e7eb1147",
"sourceParams": {},
"planParams": {
"maxPartitionsPerPIndex": 171,
"numReplicas": 0
},
"uuid": "7e334514e30a900d"}
И мой код поиска:
Product.searchAsync = function (term, categoryId, variations, limit, skip, sort) {
return new Promise(function (resolve, reject) {
var SearchQuery = Couchbase.SearchQuery;
var SearchFacet = Couchbase.SearchFacet;
var tqs = []
if (term) {
tqs.push(SearchQuery.match(term)); // It search in default field, here it's _all
}
if (categoryId) {
tqs.push(SearchQuery.term(categoryId).field("categories.$ref"));
}
if (variations) {
variations.map(v => tqs.push(SearchQuery.match(v).field("variationSerials")));
}
tqs.push(SearchQuery.booleanField(true).field("isActive"));
tqs.push(SearchQuery.booleanField(true).field("isVisible"));
var conjunction = SearchQuery.conjuncts(tqs);
var query = SearchQuery.new("product_search", conjunction);
query.addFacet("variations", SearchFacet.term("variationSerials", 100));
query.limit(limit);
query.skip(skip);
if (sort)
query.sort(sort);
query.fields(["name", "fobCurrency", "fobPriceMin", "fobPriceMax", "fobUnit", "mainPicture", "minOrderQuan", "minOrderUnit"]);
ottoman.bucket.query(query, (error, result, meta) => {
if (error) {
reject(error);
}
else {
var resultset = {
hits: result,
totalHits: meta.totalHits
};
resolve(resultset);
}
});
}.bind(this))
}
Мой тестовый сервер имеет процессор Intel® Xeon® E7-4890 v2 2,80 ГГц и 12 ГБ ОЗУ. В одном узле, если я использую "Мосс" в качестве индекса, моя служба может отвечать только на 300 запросов в секунду. Если я изменил тип индекса на "Ожог", он увеличивается до 500-530 запросов в секунду. Я считаю, что это не очень хорошие результаты. Что я делаю неправильно? Как я могу увеличить производительность?