我正在努力将搜索引擎从sql数据库移植到elasticsearch.这样做的主要原因是能够轻松地计算构面.
目前我们通过生成precalc表在sql上有方面.它运行良好,但维护很痛苦,只有数据子集支持facet.
现在ES原型正在工作,我正在对这两个解决方案进行基准测试,看起来ES版本在性能方面略逊于sql版本(在可维护性方面,它要好得多).
我使用了完全相同的机器配置,一个64位平台,32 GB的RAM,一个ssd磁盘和一个3ghz的四核Intel Xeon来比较sql和ES.
文档不小,大约有200个字段,根据请求,使用基于脚本的排序,并且总是在doc的8个字段上计算facet.
该索引包含3百万个文档,如果我没有记错的话它与ES可以处理的相对较小.
在查询方面,我使用过滤查询,对于某些请求,我使用custom_filters_score查询来计算得分并将其用于排序.
由于方面的原因,某些过滤器是全局的,但过滤后的查询中总会有一些过滤器,因此应减少扫描的文档数量(并非所有索引都被扫描).
我在测试中使用了两个度量:服务器执行搜索所花费的时间,以及并行运行100个线程的客户端执行的查询数量.
对于elasticsearch,每个查询在服务器上花费的平均时间大约为500毫秒(并行100个查询),客户端上的平均查询时间大约为160(构建查询,发送它时会丢失一些ms,接收结果并解析它们).这是一个索引有1个碎片和0个副本,当我增加碎片/复制品的数量时,性能显着下降.
对于sql,执行查询所花费的平均时间约为360毫秒(同上,并行运行100个查询),客户端上的平均查询次数约为200.
我知道这很难比较,但由于我对预期的结果一无所知,我想知道是否有人可以评论这些措施.
也许我错过了一些东西,它应该快一个数量级,或者这些是类似环境的典型结果,我不知道.
在我的案例中我能期待什么?您在ES的类似情况下观察到了什么?它是否支持并发请求?在同时进行100次查询时,执行查询的时间是否应该在500毫秒的范围内?有没有办法改善搜索性能?
欢迎任何信息或评论,这是决定工业化原型的重要部分.
谢谢.
我正在尝试使用elasticsearch搜索特定的短语,即"foo bar".我的查询类似于下面的查询:
curl -X GET "http://localhost:9200/objects/object/_search" -d '{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "\"foo bar\"",
"default_field": "_all"
}
}
]
}
}
}'
Run Code Online (Sandbox Code Playgroud)
我的索引中有两个对象,看起来类似于:
{
sub_sections: [
{
name: "foo"
},
{
name: "bar"
}
]
}
Run Code Online (Sandbox Code Playgroud)
和
{
sub_sections: [
{
name: "foo bar"
}
]
}
Run Code Online (Sandbox Code Playgroud)
当我在查询中使用双引号时,我期待只返回匹配短语的最后一个对象.但是,始终返回两个对象.auto_generate_phrase_queries到目前为止,我已经尝试过像++这样没有运气的选项.
这是预期的行为吗?我怎么能只返回具有完全短语匹配的文件?
我正在使用范围方面进行搜索:
{
"query": {
"match_all": {}
},
"facets": {
"prices": {
"range": {
"field": "product_price",
"ranges": [
{"from": 0, "to": 200},
{"from": 200, "to": 400},
{"from": 400, "to": 600},
{"from": 600, "to": 800},
{"from": 800}
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,我得到了范围的响应:
[
{
"from": 0.0,
"to": 200.0,
"count": 0,
"total_count": 0,
"total": 0.0,
"mean": 0.0
},
{
"from": 200.0,
"to": 400.0,
"count": 1,
"min": 399.0,
"max": 399.0,
"total_count": 1,
"total": 399.0,
"mean": 399.0
},
{
"from": 400.0,
"to": 600.0,
"count": …Run Code Online (Sandbox Code Playgroud) 我建立与elasticsearch自动完成搜索,所以我需要查询3个指标posts,comments,authors。我有以下查询:
{
"query":{
"query_string":{
"query":"something"
}
}
}
Run Code Online (Sandbox Code Playgroud)
电话:
curl -X GET 'http://localhost:9200/posts,comments,authors/_search?pretty' -d '{
"query": {
"query_string": {
"query": "something"
}
}
}'
Run Code Online (Sandbox Code Playgroud)
我需要按特定的索引字段对结果进行排序,例如:
帖子索引有一个名为comments_count,评论votes_count和作者的字段posts_count。比较帖子时,则应按,然后是comments_count评论,然后是votes_count作者posts_count。
可以这样做吗?我不想将索引合并为一个,因为它们索引完全不同的文档。
通过使用GROK filter,我们可以向Logstash添加新字段.
但是,在这里,我想知道如何为该特定字段设置分析器.
例如:,我有一个新的id字段,它有一个字段a_b,但是Elasticsearch发布的普通分析器会将其分解为a和b.因此,我无法有效地在该特定字段上应用术语功能并使其有用.
这里对于ID字段,我想应用我自己的自定义分析器,它不会对值进行标记,而是应用小写过滤器.
如何在logstash中完成此操作.
我正在使用Suggest API为餐馆名称创建自动完成功能,但我遇到了一个小问题.一些餐馆名称以数字开头,例如:
68 - 86 Bar & Restaurant
Run Code Online (Sandbox Code Playgroud)
我希望能够打字68并让餐厅回来.我尝试过使用空白分析器,但它并没有解决我的问题.
这是餐馆名称的分析输出:
{
"tokens": [
{
"token": "68",
"start_offset": 0,
"end_offset": 2,
"type": "<NUM>",
"position": 1
},
{
"token": "86",
"start_offset": 5,
"end_offset": 7,
"type": "<NUM>",
"position": 2
},
{
"token": "bar",
"start_offset": 8,
"end_offset": 11,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "restaurant",
"start_offset": 14,
"end_offset": 24,
"type": "<ALPHANUM>",
"position": 4
}
]
}
Run Code Online (Sandbox Code Playgroud)
以下是重现我的问题的命令:
PUT restaurants
{ }
PUT restaurants/restaurant/_mapping
{
"location": {
"index_analyzer": "whitespace",
"search_analyzer": "whitespace",
"properties": …Run Code Online (Sandbox Code Playgroud) 有时,在 ElasticSearch v1.1.0 中插入新文档后,会出现 noshardavailableactionexception 错误。当检查时
curl 'localhost:9200/_cat/shards/cvk'
Run Code Online (Sandbox Code Playgroud)
我得到了答案:cvk 0 p UNASSIGNED
使用命令重新启动弹性后:
/etc/init.d/elasticsearch restart
Run Code Online (Sandbox Code Playgroud)
一切正常。
ES 在 VPS ubuntu v12 上运行,索引只有 1 个分片并且禁用复制。
我在日志中发现“设备上没有剩余空间”错误。但我的机器上有足够的磁盘空间。我正在批量上传 1000 个文档(每个文档大约 512 字节)。
如何解决冲水问题?如果不可能,如何通过 REST 接口重新分配分片(无需重新启动服务器)?
来自我的 vps 的 df
Filesystem Size Used Avail Use% Mounted on
/dev/vda 20G 13G 6.6G 65% /
udev 237M 12K 237M 1% /dev
tmpfs 50M 216K 49M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 246M 0 246M 0% /run/shm
Run Code Online (Sandbox Code Playgroud)
来自 vps 的日志显示错误
[2014-05-03 04:20:20,088][WARN ][index.translog ] …Run Code Online (Sandbox Code Playgroud) 不知怎的,我似乎无法得到包含我的聚合的回复......
使用curl它按预期工作:
HBZUMB01$ curl -XPOST "http://localhost:9200/contents/_search" -d '{
"size": 0,
"aggs": {
"sport_count": {
"value_count": {
"field": "dwid"
}
}
}
}'
Run Code Online (Sandbox Code Playgroud)
我收到了回复:
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 90,
"max_score": 0.0,
"hits": []
},
"aggregations": {
"sport_count": {
"value": 399
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是使用rails中的代码:
query = '{
"size": 0,
"aggs": {
"sport_count": {
"value_count": {
"field": "dwid"
}
}
}
}'
@response = Content.search(query).to_json
Run Code Online (Sandbox Code Playgroud)
并在浏览器中呈现它
respond_to do |format| …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用新的 migs getaway (MPGS) 我遵循了下一个 url 中的代码
https://ap-gateway.mastercard.com/api/documentation/integrationGuidelines/hostedCheckout/integrationModelHostedCheckout.html
Run Code Online (Sandbox Code Playgroud)
当然我被替换了所有必填字段
<html>
<head>
<script src="https://ap-gateway.mastercard.com/checkout/version/36/checkout.js"
data-error="errorCallback"
data-cancel="cancelCallback">
</script>
<script type="text/javascript">
function errorCallback(error) {
console.log(JSON.stringify(error));
}
function cancelCallback() {
console.log('Payment cancelled');
}
Checkout.configure({
merchant: 'xxxxxx',
order: {
amount: function() {
//Dynamic calculation of amount
return 80 + 20;
},
currency: 'USD',
description: 'Ordered goods',
id: 'xxxxxx'
},
interaction: {
merchant: {
name: 'xxxxxx',
address: {
line1: '200 Sample St',
line2: '1234 Example Town'
}
}
}
});
</script>
</head>
<body>
...
<input type="button" …Run Code Online (Sandbox Code Playgroud) 我需要在 android 平台的 react native 中关注下一个字段输入。但是 focus() 函数,在 android react native 中不存在,只在 IOS 中存在。
这个怎么弄?我使用带有打字稿的本机反应。
android ×1
autocomplete ×1
autosuggest ×1
bank ×1
facet ×1
integration ×1
java ×1
logging ×1
logstash ×1
memory ×1
performance ×1
range ×1
react-native ×1
reactjs ×1
ruby ×1
typescript ×1