我正在通过将Mariadb与elasticsearch和logstash链接来实现搜索功能。
顺便..
顺便说一句,每当我从logsdbash的mariadb中获得一个值时,该值就会累积在Elasticsearch的命中中。
我想知道怎么了
elasticsearch.yml
# ---------------------------------- Cluster -----------------------
cluster.name: nov-cluster
# ------------------------------------ Node ------------------------
node.name: nov-node1
# ---------------------------------- Network -----------------------
network.host: 0.0.0.0
http.port: 9200
logstash.conf
input {
stdin { }
jdbc {
jdbc_driver_library => "/usr/local/logstash/lib/mariadb-java-
client-2.4.3.jar"
jdbc_driver_class => "org.mariadb.jdbc.Driver"
jdbc_connection_string =>
"jdbc:mariadb://localhost:3306/Novtree_ShoppingMall?user=root"
jdbc_user => "root"
schedule => "* * * * *"
statement => "SELECT * FROM products"
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "novtree_shoppingmall"
}
stdout {
codec => rubydebug
}
}
nodeJS
const { Client } = require('@elastic/elasticsearch')
router.post('/', async (req, res) => {
try {
const { body } = await esClient.search({
index: 'novtree_shoppingmall',
body: {
query: {
multi_match : {
query: req.body.search,
fields: [ 'title', 'content' ],
minimum_should_match: 3,
}
}
}
})
res.render('index', {
hits: body.hits.hits,
nonUser: req.nonUser
});
} catch (e) {
console.error(e);
}
});
logstash
我每分钟都会从产品表中获取数据
elasticsearch
每当logstash每分钟从产品表中获取数据时,它就会按点击次数累积。
答案 0 :(得分:2)
我看到,每隔一分钟,logstash就会从产品数据库中获取aaaa / sunglass / alanmikle行,然后将其插入elasticsearch中。数据库的同一行将每分钟重复一次。有两种解决方法。
首先,您可以使用fingerprint过滤器为该行生成一个唯一的ID,并将其设置为elasticsearch输出上的document_id选项。这将导致该行每分钟被提取并覆盖一次。这是非常低效的,但是可以提供您想要的结果。
第二,如果数据库包含可以用于标识新行的序列或时间戳列,则可以使用jdbc插件的state管理功能,该功能将保留该值该列的形式为:sql_last_value,可在仅获取新行的WHERE子句中使用。