我应该如何在Elasticsearch中索引此架构

时间:2014-07-05 15:14:10

标签: indexing lucene elasticsearch data-modeling

我对如何在Elasticsearch中索引这些文档感到有点迷失。

文件1

{
    text: ['chicken']
}

文件2

{
    text: ['chicken'], [['broth', 'stock']]
}

我需要能够使用'鸡肉味'或'鸡肉味汤'查询这些,并且它应该返回两个具有相同分数的文档,因为它们的所有术语都已在输入查询中匹配。 它也不应该返回doc 2,只有'chicken'作为查询。

基本上,我想知道'text'字段中的所有术语都已在查询中的某处找到,而内部数组(即:'broth'和'stock'就像一个OR子句)。

这甚至可能吗?

更新

我确实找到了一种(繁琐的)方式。我通过将他们的字段组合成短语来保存文档(例如: ['chicken broth','chicken stock'] for doc 2)。然后我使用输入的每个组合作为短语进行搜索(例如: ['鸡肉','鸡肉味','鸡肉味肉汤','鸡肉汤',...] 。)< / p>

这个解决方案确实给了我想要的结果,但我不禁觉得这是一个可以更优雅地处理的常见情况。感觉就像ngram在我的答案的路径上,但我不能完全解决它。

2 个答案:

答案 0 :(得分:1)

在不添加自定义映射的情况下索引文档时,默认情况下使用Standard analyzer进行Elasticsearch。

您可以从文本字段中删除数组并将文档编入索引:

文件1

{
   "text": "chicken"
}

文件2

{
   "text": "chicken broth stock"
}

标准分析器将在Lucene索引中创建以下标记:

文件1

"chicken"

文件2

"chicken", "broth", "stock"

您的文档与搜索字词匹配如下:

:两个文档中的术语“鸡”匹配,因为文档1中的文本字段较短,其得分高于文档2.

鸡肉风味:两个文件中的“鸡肉”一词都匹配,但“风味”一词并不匹配。同样,由于文档1中的文本字段较短,因此得分高于文档2.

鸡肉味肉汤:两个文件中的“鸡肉”一词匹配,文件2中的“肉汤”一词也匹配。“任何一种”中的“味道”一词都不匹配文档。文档2的评分高于文档1,因为它匹配查询中的两个术语。

我没有真正看到ngrams的用例,因为上面做了你想要的。

答案 1 :(得分:0)

所以这是你可以尝试的东西。过滤器可以解决您的问题,但您必须改变索引文档的方式。

因此,不是按照您的方式索引doc1,而是将其编入索引:

PUT /test-index/.percolator/1
{
    "query": {
        "term": {
           "text": {
              "value": "chicken"
           }
        }
    }
}

而且,索引doc2就像这样:

PUT /test-index/.percolator/2
{
   "query": {
      "bool": {
         "must": [
            {
               "term": {
                  "text": {
                     "value": "chicken"
                  }
               }
            },
            {
               "bool": {
                  "should": [
                     {
                        "term": {
                           "text": {
                              "value": "broth"
                           }
                        }
                     },
                     {
                        "term": {
                           "text": {
                              "value": "stock"
                           }
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}

没有,而不是查询你之前查询文件的方式,渗透它们:

GET /test-index/all_terms_search/_percolate
{
    "doc": {
        "text": "chicken flavored stock"
    }
}

这将获得您的文件。这也使您可以灵活地控制要匹配的内容和内容。当您在过滤器中索引文档的反向查询时,您提供该查询的ID并对应于该ID,您可以使用更简单的形式维护文本,以便在Elasticsearch中的单独索引中使用或可能是其他一些可以非常快速地获得匹配文档的数据存储区。