首页 > 解决方案 > 我想找到子字符串的确切术语,确切的术语不仅仅是术语的一部分

问题描述

我有一组来自 wikidata ( http://www.wikidata.org ) 的 json 文档来索引到 elasticsearch 进行搜索。它有几个字段。例如,它如下所示。

{
   eId:Q25338
   eLabel:"The Little Prince, Little Prince",
   ...
}

在这里,我想做的是让用户搜索“确切的术语”,而不是术语的一部分。意思是,如果用户搜索“王子”,我不想在搜索结果中显示此文档。当用户输入整个词“小王子”或“小王子”时,我想让这个 json 包含在搜索结果中,即。

我当前的 Mappings.json。

  "mappings": {
    "entity": {
      "properties": {
        "eLabel": { # want to replace
          "type": "text" ,
          "index_options": "docs" ,
          "analyzer": "my_analyzer"
        } ,
        "eid": {
          "type": "keyword"
        } ,
        "subclass": {
          "type": "boolean"
        } ,
        "pLabel": {
          "type": "text" ,
          "index_options": "docs" ,
          "analyzer": "my_analyzer"
        } ,
        "prop_id": {
          "type": "keyword"
        } ,
        "pType": {
          "type": "keyword"
        } ,
        "way": {
          "type": "keyword"
        } ,
        "chain": {
          "type": "integer"
        } ,
        "siteKey": {
          "type": "keyword"
        },
        "version": {
          "type": "integer"
        },
        "docId": {
          "type": "integer"
        }
      }
    }
  }

标签: elasticsearch

解决方案


我是否应该预处理所有逗号分隔的句子(某些 eLabel 在列表中有数十个元素)并将其制作成一堆不同的文档并分别制作关键字词字段?

这正是你应该做的。Elasticsearch 无法为您处理逗号分隔的列表。它会认为您的数据只是 1 个完整的字符串。但是,如果您对其进行预处理,然后将结果字段设置为关键字字段,那将非常有效 - 这正是关键字字段类型的设计目的。我建议使用术语查询来搜索完全匹配。(与 Match 查询相反,Term 查询不分析传入的查询,因此效率更高。)


推荐阅读