我最近开始使用ElasticSearch,我似乎无法让它搜索一个单词的一部分.
示例:我在我的couchdb中有三个索引在ElasticSearch中索引的文档:
{
"_id" : "1",
"name" : "John Doeman",
"function" : "Janitor"
}
{
"_id" : "2",
"name" : "Jane Doewoman",
"function" : "Teacher"
}
{
"_id" : "3",
"name" : "Jimmy Jackal",
"function" : "Student"
}
Run Code Online (Sandbox Code Playgroud)
所以现在,我想搜索包含"Doe"的所有文件
curl http://localhost:9200/my_idx/my_type/_search?q=Doe
Run Code Online (Sandbox Code Playgroud)
这不会返回任何命中.但是,如果我搜索
curl http://localhost:9200/my_idx/my_type/_search?q=Doeman
Run Code Online (Sandbox Code Playgroud)
它确实返回一个文件(John Doeman).
我尝试过设置不同的分析器和不同的过滤器作为索引的属性.我也试过使用完整的查询(例如:
{
"query": {
"term": {
"name": "Doe"
}
}
}
Run Code Online (Sandbox Code Playgroud)
但似乎没有任何作用.
当我搜索"Doe"时,如何让ElasticSearch找到John Doeman和Jane Doewoman?
UPDATE
我尝试使用nGram标记器和过滤器,就像Igor提出的那样,如下所示:
{
"index": {
"index": "my_idx",
"type": "my_type",
"bulk_size": "100",
"bulk_timeout": "10ms",
"analysis": {
"analyzer": {
"my_analyzer": { …Run Code Online (Sandbox Code Playgroud) 尝试将批量更新用于ES 1.0.1.
我在Postman内发布以下内容:
URL POST或PUT以http://localhost:9200/_bulk
请求机构:
{ "update" : { "_index" : "test_people", "_type" : "person", "_id" : "1" }} \n
{ "doc" : { "name":"hi", "age":100 }} \n
Run Code Online (Sandbox Code Playgroud)
我有没有尝试过\n.我总是得到
{
"error": "ActionRequestValidationException[Validation Failed: 1: no requests added;]",
"status": 500
}
Run Code Online (Sandbox Code Playgroud)
它在使用数据创建时也做同样的事情:
{
"create": {
"_index": "test_people",
"_type": "person",
"_id": "1"
}
}
{
"name": "hi",
"age": 100
}
Run Code Online (Sandbox Code Playgroud)
我在Mac,PC和Linux上试过这个,我不断得到同样的错误.
我有3个班:
public class Alpha {
public Number number;
}
public class Beta extends Alpha {
public String number;
}
public class Gama extends Beta {
public int number;
}
Run Code Online (Sandbox Code Playgroud)
为什么以下代码编译?而且,为什么测试通过没有任何运行时错误?
@Test
public void test() {
final Beta a = new Gama();
a.number = "its a string";
((Alpha) a).number = 13;
((Gama) a).number = 42;
assertEquals("its a string", a.number);
assertEquals(13, ((Alpha) a).number);
assertEquals(42, ((Gama) a).number);
}
Run Code Online (Sandbox Code Playgroud) 我正在对ElasticSearch进行基准测试,以实现非常高的索引吞吐量目的.
我目前的目标是能够在几小时内索引30亿(3,000,000,000)个文档.为此,我目前有3台Windows服务器机器,每台机器有16GB RAM和8个处理器.正在插入的文档具有非常简单的映射,仅包含少数非分析的数字字段(_all已禁用).
我能够使用这个相对适中的装备每秒达到大约120,000个索引请求(使用大桌面进行监控),我相信可以进一步提高吞吐量.我正在使用一些.net NEST客户端来发送索引批量请求,批量处理1500个索引操作.
不幸的是,每秒120k请求的吞吐量不会持续很长时间,并且速率逐渐降低,在几个小时后降至~15k.
监控机器显示cpu不是瓶颈.但是,所有机器上的物理磁盘(而不是SSD)空闲时间似乎都在下降,平均闲置率低于15%.
设置refresh_interval为60s,而不是300s,最后是15m,似乎没什么帮助.在单个分片中监视单个translog,显示translog每30分钟刷新一次,然后达到200MB.
我尝试过使用两种分片策略:
这两种尝试都会产生相当类似的体验,我认为这是有意义的,因为它是相同数量的分片.
看一下这些片段,我可以看到大多数分片都有~30个已提交的片段,以及相似数量的可搜索片段.细分市场规模各不相同 有一段时间,尝试使用max_num_segments = 1来优化索引,在完成之后似乎有所帮助(花了很长时间).
在任何时候,从一开始就开始整个摄取过程,在删除使用过的索引并创建新索引之后 - 导致相同的行为.最初的高指数吞吐量,但逐渐减少,早在达到30亿文件的目标之前.此时的索引大小约为120GB.
我正在使用ElasticSearch 1.4版本.Xms和Xmx配置为8192MB,可用内存的50%.索引缓冲区设置为30%.
我的问题如下:
我无法通过Java API连接到vanilla ElasticSearch集群.
重现:
#start elasticsearch
elasticsearch -f
#checking in a new window
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{\
"user" : "kimchy",\
"post_date" : "2009-11-15T14:12:12",\
"message" : "trying out Elastic Search"\
}'
Run Code Online (Sandbox Code Playgroud)
结果:
{
"ok": true,
"_index": "twitter",
"_type": "tweet",
"_id": "1",
"_version": 3
}
Run Code Online (Sandbox Code Playgroud)
$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:kimchy'
Run Code Online (Sandbox Code Playgroud)
结果:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.30685282,
"hits": [
{
"_index": "twitter",
"_type": "tweet",
"_id": "1",
"_score": …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Java API连接到ElasticSearch服务器.我使用elasticsearch服务来启动/停止和弹性搜索头来可视化集群.群集/节点处于活动状态,REST API在9200上通过卷曲工作正常.我已经阅读了关于此主题的几乎所有帖子,但我无法使其工作,下面是我的详细信息:
我尝试了所有这些:
... 9200/_cluster /节点
{
"ok": true,
"cluster_name": "test",
"nodes": {
"NLVBbJpJTZWefeI2kQt3Tg": {
"name": "inventory_management",
"transport_address": "inet[/127.0.0.1:9300]",
"hostname": "devhost1",
"version": "0.90.5",
"http_address": "inet[/127.0.0.1:9200]"
}
}
}
Run Code Online (Sandbox Code Playgroud)
... 9200/_cluster /健康?漂亮=真
{
"cluster_name" : "test",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0
}
Run Code Online (Sandbox Code Playgroud)
Java代码:
Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "test").put("node.name", "inventory_management").build();
Client client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress("localhost", …Run Code Online (Sandbox Code Playgroud) 该ElasticSearch文件上写着:
别名也可以映射到多个索引,并且在指定别名时,别名将自动扩展为别名索引.
但是当我尝试为两个索引添加一个别名并写入两个索引时,似乎都没有更新文档.如果我删除其中一个别名,它将正确写入仍然存在的别名.
多个写别名失败:
$ curl -XGET 'http://localhost:9200/_aliases'
Run Code Online (Sandbox Code Playgroud)
结果:
{
"dev_01": {
"aliases": {
"dev_read": {},
"dev_write": {}
}
},
"dev": {
"aliases": {
"dev_write": {}
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用单个别名:
$ curl -XGET 'http://localhost:9200/_aliases'
Run Code Online (Sandbox Code Playgroud)
结果:
{
"dev_01": {
"aliases": {
"dev_read": {},
"dev_write": {}
}
},
"dev": {
"aliases": {}
}
}
Run Code Online (Sandbox Code Playgroud)
elasticsearch是否支持写入多个索引?如果指向多个索引,别名是只读的吗?
我试图找出一种方法来删除elasticsearch索引中特定属性的所有条目,并删除该属性的所有类型映射.
我一直在查看以下两个doc页面:put mapping和delete mapping
从第二个链接:
"允许删除映射(类型)及其数据.REST端点是/ {index}/{type},带有DELETE方法."
我认为我需要的是/{index}/{type}/{property}什么?
我是否需要重新创建整个索引来完成此操作,即在类型之间移动和操作数据?
例如,在映射上调用GET:
curl -XGET 'http://.../some_index/some_type/_mapping'
Run Code Online (Sandbox Code Playgroud)
结果:
{
"some_type": {
"properties": {
"propVal1": {
"type": "double",
"index": "analyzed"
},
"propVal2": {
"type": "string",
"analyzer": "keyword"
},
"propVal3": {
"type": "string",
"analyzer": "keyword"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在此删除操作之后propVal3将返回:
curl -XGET 'http://.../some_index/some_type/_mapping'
Run Code Online (Sandbox Code Playgroud)
结果:
{
"some_type": {
"properties": {
"propVal1": {
"type": "double",
"index": "analyzed"
},
"propVal2": {
"type": "string",
"analyzer": "keyword"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并且propVal3将通过索引删除所有数据.
我正在使用jdbc-river从Sql Server数据库/表中读取数据.截至目前,我已为数据库中的每个表创建了一个单独的类型.作为我实现的下一步,我想使用父/子类型,以便我可以翻译我的sql表之间的关系并存储它们.
Table1
Col_id| name| prop1|prop2|prop3
child_table1
col_id| table_id| child_prop1|child_prop2|child_prop3
curl -XPUT 'localhost:9200/_river/parent/_meta' -d '{
"type" : "jdbc",
"jdbc" : {
"driver" : "com.mysql.jdbc.Driver",
"url" : "jdbc:mysql://localhost:3306/test",
"user" : "",
"password" : "",
"sql" : "select * from table1",
"index" : "index1",
"type" : "parent"
}
}'
curl -XPUT 'localhost:9200/_river/child/_meta' -d '{
"type" : "jdbc",
"jdbc" : {
"driver" : "com.mysql.jdbc.Driver",
"url" : "jdbc:mysql://localhost:3306/test",
"user" : "",
"password" : "",
"sql" : "select * from child_table1",
"index" : "index1",
"type" …Run Code Online (Sandbox Code Playgroud) sql-server parent-child elasticsearch elasticsearch-jdbc-river
是否有可能结合起来query_string,并bool query在filter query?
例如 -
{
"filter": {
"query_string": {
"query": "field:text"
}
},
"bool": {
"should": {
"match": {
"field": "text"
}
}
}
}
Run Code Online (Sandbox Code Playgroud) java ×3
lucene ×2
booleanquery ×1
jls ×1
json ×1
parent-child ×1
query-string ×1
rest ×1
sql-server ×1
subclassing ×1
throughput ×1