在多值字段中特定查询索引值

时间:2014-08-03 08:14:24

标签: solr lucene elasticsearch

我有一个多值字段,由字符串数组填充。现在我想找到所有有i的文件。即foo作为我。即此字段中的第二个(!)字符串。这可能吗?

如果不是,您的建议是什么?

2 个答案:

答案 0 :(得分:1)

对于Solr,您可以使用UpdateRequestProcessor复制和修改字段以添加位置前缀。所以,你最终会得到2_91或类似的结果。您可以使用StatelessScriptURP

或者,您可以将此信息作为多个字段发送,并使用动态字段定义来映射它们。

基本上,对于Solr和ES,底层Lucene将多值字符串存储为一个长字符串,在第一个值的最后一个标记和第二个值的第一个标记之间具有大的标记偏移量。所以,绝对位置需要某种黑客攻击。运行时黑客(例如另一个答案中的ElasticSearch示例)在查询期间很昂贵。内容修改黑客(例如本例中的URP)在使用额外磁盘空间或更复杂的架构时非常昂贵。

答案 1 :(得分:0)

在elasticsearch中,您可以使用Script Filter实现此目的,这是一个示例,

考虑将phone_no映射为

{
   "index": {
      "mappings": {
         "type": {
            "properties": {
               "phone_no": {
                  "type": "string"
               }
            }
         }
      }
   }
}

放一份文件(第一份),

POST index/type
{
    "phone_no" :["91","92210"]
}

和第二个,

POST index/type
{
    "phone_no" :["92210","91"]
}

所以,如果你想找到第二个值等于91,那么这是一个查询,

POST index/type/_search
{
    "filter" :{
        "script": {
           "script": "_source.phone_no[1].equals(val)",
           "params": {
               "val" :"91"
           }
        }
    }
}

其中,val可以是用户定义的,

在上面的脚本中,没有处理任何案例(例如,如果它的大小> 1,可能会在某个时候返回execption,您可以根据需要修改脚本)。谢谢,

希望这可能会有所帮助!!