这是我用来进行简单搜索的一小段代码:
import com.sksamuel.elastic4s.{ElasticsearchClientUri, ElasticClient}
import com.sksamuel.elastic4s.ElasticDsl._
import org.elasticsearch.common.settings.ImmutableSettings
object Main3 extends App {
val uri = ElasticsearchClientUri("elasticsearch://localhost:9300")
val settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elasticsearch").build()
val client = ElasticClient.remote(settings, uri)
if (client.exists("bands").await.isExists()) {
println("Index already exists!")
val num = readLine("Want to delete the index? ")
if (num == "y") {
client.execute {deleteIndex("bands")}.await
} else {
println("Leaving this here ...")
}
} else {
println("Creating the index!")
client.execute(create index "bands").await
client.execute(index into "bands/artists" fields "name"->"coldplay").await
val resp = client.execute(search in "bands/artists" query "coldplay").await
println(resp)
}
client.close()
}
这是我得到的结果:
Connected to the target VM, address: '127.0.0.1:51872', transport: 'socket'
log4j:WARN No appenders could be found for logger (org.elasticsearch.plugins).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Creating the index!
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
Disconnected from the target VM, address: '127.0.0.1:51872', transport: 'socket'
Process finished with exit code 0
创建索引并将文档添加到该索引运行良好,但是简单的搜索查询没有任何结果。我什至在Sense上检查了这一点。
GET bands/artists/_search
{
"query": {
"match": {
"name": "coldplay"
}
}
}
给
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.30685282,
"hits": [
{
"_index": "bands",
"_type": "artists",
"_id": "AU21OYO9w-qZq8hmdTOl",
"_score": 0.30685282,
"_source": {
"name": "coldplay"
}
}
]
}
}
如何解决这个问题?
我怀疑正在发生的事情是您在代码中的索引操作之后立即进行搜索。但是,在Elasticsearch中,文档尚未准备好立即进行搜索。请参阅此处的刷新间隔设置。(因此,当您使用其余客户端时,由于必须在选项卡之间手动滑动等事实,您正在等待几秒钟)。
您可以通过在索引后面放置Thread.sleep(3000)来快速测试。如果可以确认它可以正常工作,那么您需要考虑如何编写程序。
通常,您只是索引,当数据可用时,它便可用。这称为最终一致性。在此期间(秒),用户可能无法使用它进行搜索。通常这不是问题。
如果这是一个问题,那么您将必须做一些技巧,就像我们在elastic4s的单元测试中所做的那样,在这里您要不断“计数”,直到获得正确数量的文档为止。
最后,您还可以手动调用“刷新”索引以加快速度
client.execute {
refresh index "indexname"
}
但这通常仅在您关闭批量插入的自动刷新时才使用。
关于搜索字段的两个问题: > 我想使用elastic4s dsl查找特定id是否存在。此查询elasticsearch API的aquivilent: 卷曲-XGET'http://localhost:9200/indexName/indexType/_search/exists?q=_id:foo' 但这会产生isExists无法检查的搜索定义 我想获取所有id,到目前为止,我得到了这个解决方案
有什么方法可以让我使用YouTube API检索超过100个结果? 我可以使用这个查询字符串检索多达100个结果:https://gdata.youtube.com/feeds/api/videos?q=football 但当我尝试时https://gdata.youtube.com/feeds/api/videos?q=football 我得到:http://www.w3.org/2005/At
我使用logstash将我的mysql表数据保存到elasticsearch中。现在我想使用特定字段从elasticsearch获取数据。我可以使用id获取数据,但无法使用其他字段检索数据。 我正在使用elasticsearch 5.6.12和Spring boot 2.0 searchcontroller.java 我想用first_name搜索,但什么都没有显示。我在这里做错了什么?
问题内容: 我已经多次重温了这个问题,但我从未真正找到合适的答案。 是否可以执行MySQL搜索,以按相关性返回ACTUAL准确排序的结果? 我试图创建一个ajax搜索表单,当用户在输入字段中键入内容时提出建议,并且仅使用纯MySQL查询还没有找到合适的解决方案。我知道有可用的搜索服务器,例如ElasticSearch,我想知道如何仅使用原始MySQL查询来实现。 我有一张学校科目表。少于1200行
当跨多个索引进行搜索时,elasticsearch的“多重匹配”查询将返回搜索结果中的索引名称。 响应包含字段,该字段告诉结果来自的索引 spring-data-elasticsearch中用于的类是和具有字段、、用于获取与elasticsearch查询相似的数据。但它不包含用于存储字段信息的相关字段。 还支持吗?我需要根据哪个客户端应用程序将生成一些URL发送搜索命中类型(name)。 这是我使
在Elasticsearch中,您可以执行返回点击的搜索,同时在一个响应中返回与点击分开的聚合结果。这是非常强大和有效的,因为您可以运行查询和多个聚合,并一次获得两个(或其中一个)操作的结果,避免使用简洁和简化的API进行网络往返。 我想执行搜索,当我对聚合有查询时返回点击。但我不确定如何才能做到以上几点? 我正在使用以下查询: