当前位置: 首页 > 知识库问答 >
问题:

elasticsearch中的部分搜索适用于一条记录,而不适用于其他记录

东郭鸿福
2023-03-14

弹性搜索是用以下主体创建的

body = {
        "mappings": {
            "properties": {
                "TokenizedDocumentFileName": {
                    "type": "text",
                    "analyzer": "my_analyzer",
                    "search_analyzer": "standard"
                }
            }
        },
        "settings": {
            "analysis": {
                "analyzer": {
                    "my_analyzer": {
                        "tokenizer": "keyword",
                        "filter": ["word_delimiter",
                                   "lowercase"
                                   ]
                    }
                }
            },
            "number_of_shards": "1",
            "number_of_replicas": "0"
        }
    }

下面是elasticsearch中的两种不同元数据

{'_index': 'fileboundunitmanuals',
 '_type': '_doc',
 '_id': '997439.PDF',
 '_version': 2,
 '_seq_no': 166958, 
 '_primary_term': 1,
 'found': True, '_source': {
 'IndexKey': '997439.PDF',
 'DocumentID': 997439,
 'Extension': 'PDF',
 'FileID': 174508,
 'DocumentFileName': '\\UNIT xxxxx\\411xxx\\A9.xxxx_xxxxx GAS ENGINE xxxxx_x_997439.PDF',
 'TokenizedDocumentFileName': '\\UNIT xxxxx\\411xxx\\A9. xxxx xxxxx GAS ENGINE xxxxx x 997439.PDF',
 'F1': 'UNIT xxxxx', 
 'ProjectID': 8}}  

第二记录

 {'_index': 'fileboundunitmanuals',
  '_type': '_doc',
  '_id': '3929829.pdf',
  '_version': 1,
  '_seq_no': 538517,
  '_primary_term': 3, 
  'found': True, '_source': {
  'Extension': 'pdf', 
  'DocumentID': 3929829,
  'IndexKey': '3929829.pdf',
  'FileID': '',
  'DocumentFileName': '\\Unit xxxxx\\Mary Testing\\marynewfiletest.pdf', 
  'TokenizedDocumentFileName': '\\Unit xxxxx\\Mary Testing\\marynewfiletest.pdf',
  'F1': 'Unit xxxxx',
  'ProjectID': 8}}

现在,在elasticsearch中使用以下查询搜索第一条记录时

  {
  "query":{
  "bool":{
     "must":{
        "match":{
           "TokenizedDocumentFileName":{
              "query":"997439"
           }
        }
     },
     "filter":{
        "bool":{
           "must":[
              {
                 "term":{
                    "ProjectID":8
                 }
              },
              {
                 "term":{
                    "Extension":"pdf"
                 }
              }
           ]
        }
     }
  }
  }
  }

查询以搜索第二条记录

  {
  "query":{
  "bool":{
     "must":{
        "match":{
           "TokenizedDocumentFileName":{
              "query":"marynewfiletest"
           }
        }
     },
     "filter":{
        "bool":{
           "must":[
              {
                 "term":{
                    "ProjectID":8
                 }
              },
              {
                 "term":{
                    "Extension":"pdf"
                 }
              }
           ]
        }
     }
  }
  }
  }

第一个查询是给我正确的结果,因为查询"997439"存在于TokenizedDocumentFileName中,但是当我搜索marytest 2条记录时,我得到了下面的响应。

{'took': 0, 'timed_out': False, '_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0}, 'hits': {'total': {'value': 0, 'relation': 'eq'}, 'max_score': None, 'hits': []}}

但当我给出文件名和扩展名,即“marytesting.pdf”时,在这种情况下,我得到了正确的结果。

GET-fileunitmanuals的输出

{
"fileboundunitmanuals" : {
"aliases" : { },
"mappings" : {
  "properties" : {
    "DocumentFileName" : {
      "type" : "text",
      "analyzer" : "my_analyzer",
      "search_analyzer" : "standard"
    },
    "DocumentID" : {
      "type" : "long"
    },
    "Extension" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "F1" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "FileID" : {
      "type" : "long"
    },
    "IndexKey" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    },
    "ProjectID" : {
      "type" : "long"
    },
    "TokenizedDocumentFileName" : {
      "type" : "text",
      "fields" : {
        "keyword" : {
          "type" : "keyword",
          "ignore_above" : 256
        }
      }
    }
  }
},
"settings" : {
  "index" : {
    "number_of_shards" : "1",
    "provided_name" : "fileboundunitmanuals",
    "creation_date" : "1607069298331",
    "analysis" : {
      "analyzer" : {
        "my_analyzer" : {
          "filter" : [
            "word_delimiter",
            "lowercase"
          ],
          "tokenizer" : "keyword"
        }
      }
    },
    "number_of_replicas" : "0",
    "uuid" : "u8HasYfVT6iMr7XGpdjJHg",
    "version" : {
      "created" : "7090199"
    }
  }
}
}
}

所以问题是为什么部分搜索对第一个有效,而不是对第二个有效。

共有1个答案

施阳曜
2023-03-14

根据您的映射,字段标记化文档文件名只是文本关键字,因此它没有您的分析器。因此,您的第一个查询能够工作只是巧合。

在为第一个文档编制索引之前,应确保使用正确的映射正确创建索引。

PS:我能够用你给的设置/映射创建你的索引,我得到了两个查询的预期结果,所以你就快到了。

 类似资料:
  • 问题内容: 目的 要使用Elasticsearch的记录器功能来更好地调试服务器端Groovy脚本代码。 问题总结 无法汇入 细节 使用Elasticsearch 2.3 存储在Java客户端中的脚本已经能够通过来成功访问它们。即,文件夹位置应正确。我已经看到了将代码放置在中的建议,但实际上对我不起作用) 尝试过此解决方案,即: 但是Elasticsearch日志显示了一个编译器投诉: 我检查Gi

  • 问题内容: 我想使用Log4J记录我的Java项目。我在src目录中创建了一个log4j.properties文件,其内容如下: 例如,我只想在我的主要方法中使用“ DEFAULT_LOGGER”。所以我写道: 但是,当我执行main方法时,我将消息“ Process Logger”打印到所有Appender(stdout,file和file2),但是我只想将其打印到file2。我该怎么做,或者更

  • 我有一个受保护的Web API正在运行,我想访问它。在Azure中,应用注册是: 具有Web API租户管理员权限的SPA Web API没有租户管理员权限,因此请求其id的令牌将返回“应用需要访问资源的权限”错误 我正在尝试获取Web API的承载令牌。问题是它不适用于MSAL,但适用于ADAL。 以下是我的“SPA”的ADAL vanilla JS代码: 如果我在“邮递员”中复制令牌并执行请求

  • 我正在尝试为Shopizer配置Elasticsearch,但得到以下错误。 我尽我所能配置了Elasticsearch。所以在elasticsearch.yml中我设置了。我还将shopizer-core.properties重命名为configs.properties。 我报告的最初错误是因为我没有运行ElasticSearch。我把它装在我的Mac上了。当它运行时,我现在得到以下错误。我签入

  • 我有两个版本的oracle,oracle Database 11g Enterprise Edition 11.2.0.1.0版本-生产版和oracle Database 11.g Enterprise Edition版本11.2-0.3.0版本-64位生产版 我有这个sql: 它适用于11.2.0.1.0,但在11.2.0.3.0上,我收到此错误: 我能做些什么来解决这个问题? 感谢。

  • 问题内容: 当仅使用IN运算符时,以下查询工作正常 但是当我触发这个查询时,它给我一个空白的结果 我是在做错事还是其他人遇到了同样的问题? 问题答案: 我认为您必须将“ IN”条件放在括号中才能使其起作用: 它与N1QL处理器评估操作员的优先级有关 如果使用EXPLAIN关键字运行它,它将显示它如何相互链接条件。 例如 与