【问题标题】:String lexicographic range query in ElasticsearchElasticsearch 中的字符串字典范围查询
【发布时间】:2012-09-20 12:58:55
【问题描述】:

是否可以查询 Elasticsearch 并为其提供一系列字符串?

我想像的东西:

示例映射:

     {
      "resource" : {
        "properties" : {
          "Title" : {
            "type" : "string"
          },
          "type_" : {
            "index" : "not_analyzed",
            "type" : "string"
          },
           "Summary" : {
            "format" : "dateOptionalTime",
            "type" : "date"
          }
        }
      }
    }

示例查询:

{
  "size" : 10,
  "query" : {
    "filtered" : {
      "query" : {
        "bool" : {
          "should" : [ {
            "text" : {
              "Title" : {
                "query" : "AAA",
                "type" : "phrase_prefix"
              }
            }
          }, {
            "range" : {
              "Title" : {
                "from" : "BBB",
                "to" : "CCC",
                "include_lower" : true,
                "include_upper" : true
              }
            }
          } ],
          "minimum_number_should_match" : 1
        }
      },
      "filter" : {
        "and" : {
          "filters" : [{
            "or" : {
              "filters" : [ {
                "term" : {
                  "type_" : "personType"
                }
              } ]
            }
          } ]
        }
      }
    }
  }
}

数据索引: 带有Titles'AAA'、'BBB'、'CCC'、'DDD'的资源

结果 Title 'AAA' 的资源(范围没有选择 'BBB' 和 'CCC')

任何帮助表示赞赏

【问题讨论】:

    标签: java range elasticsearch


    【解决方案1】:

    是的,这是可能的。 elasticsearch 查询 DSL 提供的 RangeQuery 在内部使用 lucene TermRangeQuery 用于类型为 string 的字段。另一方面,它使用 lucene NumericRangeQuery 作为数字/日期类型的字段。

    【讨论】:

    • 嗯,我的 ES 出了点问题,因为如果我用“名称”作为日期来索引一些资源,那么范围查询就可以工作。另一方面,如果“名称”只是字符串,则范围不起作用,结果总是 0。怎么会?
    • 这可能取决于您索引数据的方式。您是否尝试过将查询中的字词小写?
    • 好吧,我有一个非常基本的索引映射,因为我索引的资源内部有非常不同的信息/字段,例如有些有“名字”,其他有“标题”等。所以我把它留给 ES 来解决问题,它工作得很好。但是我不能用字符串进行范围搜索,即使我只索引了名称“a”,“b”,“c”并且我用愤怒查询 - 没有结果
    • 很奇怪,我刚刚尝试了您描述的内容,并且成功了。我建议再次检查您的数据,也许使用分析 API 来查看您实际索引的内容。
    【解决方案2】:

    默认情况下,ElasticSearch 将所有索引数据保持小写。 但它不会小写查询。太好了。

    总结一下:在发送查询(fromto 值)全部小写后,范围搜索就像一个魅力。

    【讨论】:

    • 我试图告诉你它是关于小写的;) 有些查询实际上是被分析的,这意味着查询进入与文档字段相同的分析过程。范围查询不是其中之一。您依赖于标题字段的默认映射(它使用下面的 lucene StandardAnalyzer),但查询按原样使用,因此手动将其小写是一个不错的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    相关资源
    最近更新 更多