我想找到子字符串的确切术语,确切术语不仅仅是术语的一部分

时间:2019-05-18 13:23:40

标签: elasticsearch

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

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

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

  • 我应该预处理所有逗号分隔的句子(某些eLabel在列表中包含数十个元素),并使其成为一堆不同的文档,并分别创建关键字词字段吗?
  • 如果没有,我如何制作映射文件以按预期进行此搜索?

我当前的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"
        }
      }
    }
  }

1 个答案:

答案 0 :(得分:0)

  

我应该预处理所有逗号分隔的句子(某些eLabel在列表中包含数十个元素),并使其变成一堆不同的文档,并分别创建关键字词字段吗?

这正是您应该做的。 Elasticsearch无法为您处理逗号分隔的列表。它将认为您的数据只是1个完整的字符串。但是,如果您对其进行预处理,然后将结果字段设置为Keyword字段,则效果很好-这正是“关键字”字段类型的设计目的。我建议使用Term query搜索完全匹配。 (与匹配查询相对应,是术语查询does not analyse the incoming query,因此效率更高。)