如何在elaticsearch中索引问题和答案

时间:2018-06-20 14:35:18

标签: elasticsearch full-text-search elasticsearch-6

我正在做一个项目,以便在Elasticsearch(第6版)中为网站的问答建立索引,以供搜索。

我首先想到的是创建两个如下所示的索引,一个用于问题,另一个用于答案。

问题映射:

{"mappings": {
"question": {
  "properties": {
    "title":{
        "type":"text"
    },
    "question": {
      "type":  "text"
    },
    "questionId":{
        "type":"keyword"
    }
  }
}
}
}

答案映射:

{"mappings": {
    "answer": {
      "properties": {
        "answer":{
            "type":"text"
        },
        "answerId": {
          "type":  "keyword"
        },
        "questionId":{
            "type":"keyword"
        }
      }
    }
  }
}

我使用多重匹配查询以及term和top_hits聚合来搜索索引的Q&A(referred question)。我使用此方法从搜索结果中删除重复项。作为答案或同一问题的问题本身可以出现在结果中。我只想在结果中的每个问题一个条目。我面临的问题是分页结果。在Elasticsearch中没有分页聚合的可能方法。它只能分页匹配,而不能汇总。

然后,我想到将问题和答案都保存在一个文档中,将答案保存在Json数组中。这种方法的问题在于,没有干净的方法可以在给定的问题文档中添加,删除或更新特定的答案。我发现的唯一方法是使用常规脚本(referred question)。在Elasticsearch v6 AFAIK中已弃用。

有没有更好,更干净的方法来设计它? 谢谢。

1 个答案:

答案 0 :(得分:6)

亲子关系

使用父子关系。它类似于嵌套模型,并允许一个实体与另一个实体关联。您可以以一对多关系将一种文档类型与另一种文档类型相关联。 有关更多信息,请访问:https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child.html

可以添加,更改或删除子级文档,而不会影响父级或其他子级。您可以使用滚动API 在父文档上进行分页。 可以使用 has_parent 连接来检索子文档。

权衡:您不必照顾重复和分页问题,​​但父子查询可能比同等嵌套查询慢5到10倍。

您的映射如下所示:

PUT /my-index
{
  "mappings": {
    "question": {
      "properties": {
        "title": {
          "type": "text"
        },
        "question": {
          "type": "text"
        },
        "questionId": {
          "type": "keyword"
        }
      }
    },
    "answer": {
      "_parent": {
        "type": "question"
      },
      "properties": {
        "answer": {
          "type": "text"
        },
        "answerId": {
          "type": "keyword"
        },
        "questionId": {
          "type": "keyword"
        }
      }
    }
  }
}