如何在 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"
}
}
]
由于 revisionDate
、projectSmirCreationDate
、changedDate
、dueDate
都是 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"
}
}
]
我在 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"
}
}
]
由于 revisionDate
、projectSmirCreationDate
、changedDate
、dueDate
都是 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"
}
}
]