如何在 elasticsearch 中搜索所有字段和 return 每个包含该搜索的文档?

How to search over all fields and return every document containing that search in elasticsearch?

我在 elasticsearch 中搜索时遇到问题。 我有一个包含多个字段的多个文档的索引。我希望能够搜索所有字段 运行 一个查询,并希望它 return 包含查询中指定值的所有文档。我发现使用 simple_query_string 对此效果很好。但是,它并没有 return 一致的结果。在我的索引中,我有几个包含日期的字段的文档。例如:

"revisionDate" : "2008-01-01T00:00:00",
"projectSmirCreationDate" : "2008-07-01T00:00:00",
"changedDate" : "1971-01-01T00:00:00",
"dueDate" : "0001-01-01T00:00:00",

这些只是几个例子,但是当我索引时:

GET new_document-20_v2/_search
{
  "size": 1000, 
  "query": {
    "simple_query_string" : {
        "query": "2008"
    }
  }
}

它只有 return 两个文档,这是一个问题,因为我的文档比两个在其字段中包含值“2008”的文档要多得多。

我在搜索文件名时也遇到了问题。 在我的索引中,有些字段包含这样的文件名:

"fileName" : "testPDF.pdf",
"fileName" : "demo.pdf",
"fileName" : "demo.txt",

当我查询时:

GET new_document-20_v2/_search
{
  "size": 1000, 
  "query": {
    "simple_query_string" : {
        "query": "demo"
    }
  }
}

我没有得到结果 但是如果我查询:

GET new_document-20_v2/_search
{
  "size": 1000, 
  "query": {
    "simple_query_string" : {
        "query": "demo.txt"
    }
  }
}

我得到了正确的结果。

有没有比我更好的搜索所有文档和字段的方法?我希望它 return 所有与查询匹配的文档,而不仅仅是两个或零个。 任何帮助将不胜感激。

如果没有指定分析器,Elasticsearch 使用标准分析器。由于 "fileName" 上没有指定分析器,demo.txt 被标记为

{
  "tokens": [
    {
      "token": "demo.txt",
      "start_offset": 0,
      "end_offset": 8,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

现在当你搜索demo时,它不会给出任何结果,但搜索demo.txt时会给出结果。


您可以改为使用 wildcard query 来搜索 fileName

中具有 demo 的文档
{
  "query": {
    "wildcard": {
      "fileName": {
        "value": "demo*"
      }
    }
  }
}

搜索结果将是

"hits": [
      {
        "_index": "67303015",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "fileName": "demo.pdf"
        }
      },
      {
        "_index": "67303015",
        "_type": "_doc",
        "_id": "3",
        "_score": 1.0,
        "_source": {
          "fileName": "demo.txt"
        }
      }
    ]

由于 revisionDateprojectSmirCreationDatechangedDatedueDate 都是 date 类型,因此您无法对这些日期进行部分搜索。

您可以使用multi-fields,在上述字段中添加一个字段(text 类型)。如下所示修改您的索引映射

{
  "mappings": {
    "properties": {
      "changedDate": {
        "type": "date",
        "fields": {
          "raw": {
            "type": "text"
          }
        }
      },
      "projectSmirCreationDate": {
        "type": "date",
        "fields": {
          "raw": {
            "type": "text"
          }
        }
      },
      "dueDate": {
        "type": "date",
        "fields": {
          "raw": {
            "type": "text"
          }
        }
      },
      "revisionDate": {
        "type": "date",
        "fields": {
          "raw": {
            "type": "text"
          }
        }
      }
    }
  }
}

索引数据:

{
  "revisionDate": "2008-02-01T00:00:00",
  "projectSmirCreationDate": "2008-02-01T00:00:00",
  "changedDate": "1971-01-01T00:00:00",
  "dueDate": "0001-01-01T00:00:00"
}
{
  "revisionDate": "2008-01-01T00:00:00",
  "projectSmirCreationDate": "2008-07-01T00:00:00",
  "changedDate": "1971-01-01T00:00:00",
  "dueDate": "0001-01-01T00:00:00"
}

搜索查询:

{
  "query": {
    "multi_match": {
      "query": "2008"
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "67303015",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "revisionDate": "2008-01-01T00:00:00",
          "projectSmirCreationDate": "2008-07-01T00:00:00",
          "changedDate": "1971-01-01T00:00:00",
          "dueDate": "0001-01-01T00:00:00"
        }
      },
      {
        "_index": "67303015",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.18232156,
        "_source": {
          "revisionDate": "2008-02-01T00:00:00",
          "projectSmirCreationDate": "2008-02-01T00:00:00",
          "changedDate": "1971-01-01T00:00:00",
          "dueDate": "0001-01-01T00:00:00"
        }
      }
    ]