【问题标题】:How can I find a number range inside a piece of text using ElasticSearch如何使用 ElasticSearch 在一段文本中找到数字范围
【发布时间】:2015-04-06 17:21:41
【问题描述】:

我一直在通过互联网阅读,试图弄清楚如何使用 Elastic Search 在一段文本中找到一个数字范围。但是我没有运气。

这是一个示例,假设我有以下一组文档(请注意,该文档没有拆分为多个字段,它只是一个文本块)。

doc1{ 味精:“我有 7 本书” }

doc2{ 味精:“我有 15 本书” }

doc3{ 味精:“我有 19 本书” }

是否可以使用 ElasticSearch 形成一个查询来查找所有拥有 10 到 20 本书的人?

谢谢 丰富

【问题讨论】:

    标签: search text elasticsearch


    【解决方案1】:

    在 ES 1.5 中,keep_types token filter 显然是为这类事情而设计的。我在这段代码中设置了它(使用 ES 1.5),它似乎工作:

    http://sense.qbox.io/gist/b2c86b748d0c33957df1dcb90a3b405b0a4ca646

    但是,我实际上并不需要它来让它工作。 standard analyzer 将文本划分为基于空格的标记,因此您可以对字段应用 range 查询(过滤器也可以),它似乎可以满足您的需求:

    我设置了一个简单的索引:

    DELETE /test_index
    
    PUT /test_index
    
    POST /test_index/doc/_bulk
    { "index": { "_id": 1 }}
    { "msg": "I have 7 books" }
    { "index": { "_id": 2 }}
    { "msg": "I have 15 books" }
    { "index": { "_id": 3 }}
    { "msg": "I have 19 books" }
    

    然后使用范围查询:

    POST /test_index/_search
    {
        "query": {
            "range": {
               "msg": {
                  "from": 10,
                  "to": 20
               }
            }
        }
    }
    ...
    {
       "took": 3,
       "timed_out": false,
       "_shards": {
          "total": 5,
          "successful": 5,
          "failed": 0
       },
       "hits": {
          "total": 2,
          "max_score": 1,
          "hits": [
             {
                "_index": "test_index",
                "_type": "doc",
                "_id": "2",
                "_score": 1,
                "_source": {
                   "msg": "I have 15 books"
                }
             },
             {
                "_index": "test_index",
                "_type": "doc",
                "_id": "3",
                "_score": 1,
                "_source": {
                   "msg": "I have 19 books"
                }
             }
          ]
       }
    }
    

    这是第二个例子的代码:

    http://sense.qbox.io/gist/0979803673efb5b7ff063c257efd82617a93bd06

    【讨论】:

    • 感谢仕龙的详细回复。所以你是说这只是开箱即用?我曾使用 Java API (1.5) 尝试过此操作,但没有任何成功。我今晚再试一次。一旦我确认它有效,我会将你的答案标记为正确。再次感谢。
    • 我没有用 Java 尝试过,我只是针对本地 ES 实例(启用了 CORS)运行了“sense”链接中的代码 sn-ps,它工作了。
    • 经过测试,似乎工作正常,谢谢。不过,我确实注意到了其他问题。我将查询更改为“gt:10”——这并没有产生我预期的结果。
    猜你喜欢
    • 2023-02-16
    • 2014-10-06
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多