elasticsearch,Solr,Lucene,elasticsearch" /> elasticsearch,Solr,Lucene,elasticsearch" />

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

Solr 在多值字段中查询特定索引值,solr,lucene,elasticsearch,Solr,Lucene,elasticsearch,我有一个由字符串数组填充的多值字段。现在我想找到所有有I的文档。efoo作为i。E此字段中的第二个(!)字符串。这可能吗 如果不是,你会提出什么建议来实现这一点 在elasticsearch中,您可以使用以下方法实现此功能,这是一个示例 考虑将电话号码映射为 { "index": { "mappings": { "type": { "properties": { "phone_no": {

我有一个由字符串数组填充的多值字段。现在我想找到所有有I的文档。e<代码>foo作为i。E此字段中的第二个(!)字符串。这可能吗


如果不是,你会提出什么建议来实现这一点

在elasticsearch中,您可以使用以下方法实现此功能,这是一个示例

考虑将电话号码映射为

{
   "index": {
      "mappings": {
         "type": {
            "properties": {
               "phone_no": {
                  "type": "string"
               }
            }
         }
      }
   }
}
把文件放在第一位

还有第二个

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,您可以根据需要修改脚本)。谢谢


希望这会有帮助

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

或者,您可以将此信息作为多个字段发送,并使用动态字段定义对其进行映射


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

是solr还是elasticsearch?这一定非常缓慢?它绕过了Lucene使搜索速度更快、使用脚本以及需要解析源字段的所有实际原因。访问_source比使用_doc慢得多,但数据没有加载到内存中。对于单个字段的访问,由于解析大型文档可能会带来额外的开销,因此_字段可能比使用_源更快。但是,如果您访问多个字段,或者源已加载用于其他目的,则源可能会更快。()而且,您不能使用其他选项来执行此操作,因此使用源筛选加载phone\u no可以提高性能。我最后做的是,按照您的建议,使用位置前缀映射阵列客户端。
POST index/type/_search
{
    "filter" :{
        "script": {
           "script": "_source.phone_no[1].equals(val)",
           "params": {
               "val" :"91"
           }
        }
    }
}