从elasticsearch查询

时间:2017-11-20 06:00:07

标签: elasticsearch

我遇到其他人的应用程序正在将数据从数据库表传递给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"

0 个答案:

没有答案