【问题标题】:Multimatch query on documents with multiple IPs对具有多个 IP 的文档进行多重匹配查询
【发布时间】:2015-12-23 18:14:20
【问题描述】:

我有以下示例文件:

doc1
{
 "privateIp": "172.31.97.21",
 "instanceType": "production",
 "publicIp": "172.31.8.12",
 "avZone": "cmp019",
 "instanceId": "i-00000039",
 "instanceState": "running",
 "description": "common node"
}

doc2
{
 "privateIp": "172.31.97.12",
 "instanceType": "production",
 "publicIp": "172.31.8.4",
 "avZone": "cmp019",
 "instanceId": "i-00000038",
 "instanceState": "running",
 "description": "common node"
}

我需要使用多重匹配查询来查询它。但是,当我执行以下查询时:

{
   "query": {
      "multi_match" : {
         "query":    "172.31.8.12", 
         "fields": ["instanceId", "description", "privateIp", "publicIp"],
         "operator": "AND",
         "type": "cross_fields",
         "lenient": true
}}}

我拿回了两个不受欢迎的文档 - 我只想要 doc1。而且doc2的得分比doc1高。

publicIpprivateIp 都映射为 IP 类型。

我怎样才能只取回 doc1?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    cross_fields 用于以词为中心的匹配

    默认情况下,分析器会将 Ip 的值分割成多个部分,用分隔点分隔

    您应该将 Ip 字段设置为未在映射中分析以匹配整个 Ip

    【讨论】:

    • 据我所知 IP 类型不采用 not_analyzed 设置,提到了here
    • 如果可能的话,您能否将特定字段的映射详细信息和您的输出结果与您获得的分数分享一下
    • 我只能共享源文档的子集。但是,当我完成练习后,它可以很好地处理子集;它也适用于上述数据。我怀疑这是映射问题,但我会继续挖掘并回来改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多