代码之家  ›  专栏  ›  技术社区  ›  JohnBigs

elasticsearch中的多种类型不能搜索

  •  0
  • JohnBigs  · 技术社区  · 6 年前

    我有这样的疑问:

    GET /peopledb/person/_search
    {
      "from": 0,
      "size": 2,
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "personId": "harp"
              }
            },
            {
              "match_phrase_prefix": {
                "name": "43"
              }
            },
            {
              "match_phrase_prefix": {
                "personAddress.city": "harp"
              }
            },
            {
              "match": {
                "personAddress.street": "harp"
              }
            },
            {
              "match": {
                "personAddress.streetNumber": "harp"
              }
            }
          ]
        }
      },
      "filter": {
        "bool": {
          "should": [
            {
              "type": {
                "name": "text"
              }
            },
            {
              "type": {
                "personAddress.streetNumber": "long"
              }
            }
          ]
        }
      }
    }
    

    哪一个 name 例如文本和 personAddress.streetNumber 很长,如果我使用这个查询并输入“23”,它就会工作并找到 streenNumber 23在哪里,但是如果我把“john”改成“long”,我会出错,因为很可能是试图把“john”改成long,但它失败了,那么我该怎么做呢?

    我唯一想要的是能够从客户端接收文本查询并在这些字段中搜索它。。。

    1 回复  |  直到 6 年前
        1
  •  0
  •   briarheart    6 年前

    只能对“文本”类型的字段使用全文搜索。其他类型(数字、日期等)的所有字段都应放在filter子句中。

    假设你有一个索引 peopledb 带类型 person 使用默认映射。在 人口数据库 索引您有两个文档:

    {
      "personId": "wheeler",
      "name": "Frank Wheeler",
      "personAddress": {
        "city": "New York",
        "street": "Revolutionary road",
        "streetNumber": 115
      }
    }
    

    {
      "personId": "harper",
      "name": "John Harper",
      "personAddress": {
        "city": "Glasgow",
        "street": "Craigiehall Street",
        "streetNumber": 32 
      }
    

    }

    您可以轻松地跨文本字段执行全文搜索:

    "query": {
      "multi_match": {
        "query": "frank harper",
        "fields": ["name", "personAddress.city", "personAddress.street"]
      }
    }
    

    此查询将返回索引中的所有两条记录。但如果你想找到文件 streetNumber is 115不能只编辑查询并包含 personAddress.streetNumber 进入字段数组,因为 街道号码 字段是标量字段,跨标量字段进行全文搜索没有多大意义。相反,您应该添加一个filter子句:

    "query": {
      "bool": {
        "must": {
          "multi_match": {
            "query": "frank harper",
            "fields": ["name", "personAddress.city", "personAddress.street"]
          }
        },
        "filter": {
          "term": {
            "personAddress.streetNumber": "115"
          }
        }
      }
    }