重用ElasticSearch过滤器来测试内存中的对象

时间:2014-09-13 13:15:13

标签: java lucene elasticsearch

我正在寻找一种方法在ElasticSearch / Lucene中重用任意文档中的过滤器语法和逻辑(无需首先将它们编入索引)。

我们说我有一个JSON对象

{"wheels":4}

过滤器:

{"exists":{"field":"windows"}}

对象不在任何索引中,是否可以重用ElasticSearch / Lucene过滤器来测试过滤器上的文档,而不是(或之前)将其插入索引(在这种情况下返回false)?

1 个答案:

答案 0 :(得分:0)

是的,你可以,这个功能在Elasticsearch中被称为Percolator:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-percolate.html

您使用percolate api在Elasticsearch中注册搜索,然后通过它渗透文档。它返回有匹配的地方。下面的示例语法来自文档 - 它应该让您很好地了解如何实现这一目标:

  

示例用法

     

使用字段消息的映射创建索引:

curl -XPUT 'localhost:9200/my-index' -d '{
  "mappings": {
    "my-type": {
      "properties": {
        "message": {
          "type": "string"
        }
      }
    }
  }
}
     

在过滤器中注册查询:

curl -XPUT 'localhost:9200/my-index/.percolator/1' -d '{
    "query" : {
        "match" : {
            "message" : "bonsai tree"
        }
    }
}'
     

将文档与注册的过滤器查询匹配:

curl -XGET 'localhost:9200/my-index/message/_percolate' -d '{
    "doc" : {
        "message" : "A new bonsai tree in the office"
    }
}'
     

上述请求将产生以下回复:

{
    "took" : 19,
    "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
    },
    "total" : 1,
    "matches" : [ 
        {
          "_index" : "my-index",
          "_id" : "1"
        }
    ]
}