我遇到其他人的应用程序正在将数据从数据库表传递给elasticsearch进行索引的情况。 挑战在于除了两个字段(模式和表)之外,所有字段名称都是任意的。发送用于索引的数据来自加载到数据仓库中的表的用户指定列。这些"其他"的名称字段匹配源数据库表中的原始列名称 - 这就是字段名称是任意的。
这两个字段名为" schema"和"表"包含模式的名称和包含发送用于索引的表中数据的表的名称。数据,而不是架构和表的名称是用户需要搜索的内容。
所以,我的具体问题是如果有一个名为的模式,例如" xyzzy"并且用户希望搜索内容以获取" xyzzy"那么所有的记录都会被匹配,因为" schema" :" xyzzy"会匹配。
我真正希望能够做的是搜索除" schema"之外的所有字段。和"表"。
这个答案接近我需要做的事情: Exclude a field on a Elasticsearch query 但问题是,如果数据的形式如下:
{ "schema" : "xyzzy", "comment" : "say xyzzy to win a prize", result: "match" }
{ "schema" : "xyzzy", "comment" : "say syzygy to win a prize", result: "no match" }
{ "schema" : "other", "comment" : "say xyzzy to win a prize", result: "match" }
第二个解决方案(在引用的帖子中),正确返回第三个记录但不是第一个记录。 第一个解决方案,正确返回第一个和第三个记录,但每次我生成搜索时,都要求我生成一个任意列的列表进行搜索。随着被索引的字段数量的增加,这可能会成为一个问题。
我真正希望能够做的是搜索所有字段"除了:架构和表格"对于字符串" xyzzy"。
这可能吗? 我已经考虑过更改映射定义(即不要索引表和模式),但这需要对其他应用程序(我无法控制)进行更改,并且可能会影响elasticsearch服务的其他用户。
以下是我到目前为止所做的一些例子(字段名称略有不同)。 首先,一些样本数据:
curl -XPUT 'localhost:9200/test-data/items/9997' -d '{
"schema": "test",
"table": "stones",
"name": "Bart ignores homer"
}'
curl -XPUT 'localhost:9200/test-data/items/9998' -d '{
"schema": "test",
"table": "stones",
"name": "Bart test for homer"
}'
curl -XPUT 'localhost:9200/test-data/items/9999' -d '{
"schema": "other",
"table": "stones",
"name": "Lisa passes test for high school"
}'
一个有效的查询,因为所有字段都列为包含。这是基于上面引用的帖子中的第一个解决方案。随着越来越多的字段被添加,这将很快变得不可行。
curl -XGET 'localhost:9200/test-data/_search?pretty=true' -d '{
"query" : {
"query_string": {
"fields": [ "addr", "eventname",
"name", "productdescription",
"productname", "productvendor", "suburb", "venuecity",
"venuename", "venuestate" ],
"query": "test"
}}
}'
一个不能产生正确结果的查询,因为它错过了id为9998的第二个记录" Bart测试了Homer" (因为模式名称是" test")。这是基于我在上面引用的帖子中的第二个答案。
curl -XGET 'localhost:9200/test-data/_search?pretty=true' -d '{
"query" : {
"query_string": {
"query": "test AND -schema:test"
}
}
}'
Elasticsearch版本信息是:
"数" :" 5.5.0"
" lucene_version" :" 6.6.0"