6

我正在努力思考这个查询是如何工作的,但我似乎遗漏了一些东西。我阅读了文档,但 ES 文档通常有点……缺乏。

目标是能够通过术语频率来限制结果,如此处所尝试

所以我建立了一个简单的索引,包括用于调试的术语向量,然后添加了两个简单的文档。

DELETE /test_index

PUT /test_index
{
   "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 0
   },
   "mappings": {
      "doc": {
         "properties": {
            "text": {
               "type": "string",
               "term_vector": "yes"
            }
         }
      }
   }
}

PUT /test_index/doc/1
{
    "text": "apple, apple, apple, apple, apple"
}

PUT /test_index/doc/2
{
    "text": "apple, apple"
}

当我查看 termvectors 时,我看到了我的期望:

GET /test_index/doc/1/_termvector
...
{
   "_index": "test_index",
   "_type": "doc",
   "_id": "1",
   "_version": 1,
   "found": true,
   "term_vectors": {
      "text": {
         "field_statistics": {
            "sum_doc_freq": 2,
            "doc_count": 2,
            "sum_ttf": 7
         },
         "terms": {
            "apple": {
               "term_freq": 5
            }
         }
      }
   }
}

GET /test_index/doc/2/_termvector
{
   "_index": "test_index",
   "_type": "doc",
   "_id": "2",
   "_version": 1,
   "found": true,
   "term_vectors": {
      "text": {
         "field_statistics": {
            "sum_doc_freq": 2,
            "doc_count": 2,
            "sum_ttf": 7
         },
         "terms": {
            "apple": {
               "term_freq": 2
            }
         }
      }
   }
}

当我运行以下查询时,"min_term_freq": 1我会返回两个文档:

POST /test_index/_search
{
   "query": {
      "more_like_this": {
         "fields": [
            "text"
         ],
         "like_text": "apple",
         "min_term_freq": 1,
         "percent_terms_to_match": 1,
         "min_doc_freq": 1
      }
   }
}
...
{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 0.5816214,
      "hits": [
         {
            "_index": "test_index",
            "_type": "doc",
            "_id": "1",
            "_score": 0.5816214,
            "_source": {
               "text": "apple, apple, apple, apple, apple"
            }
         },
         {
            "_index": "test_index",
            "_type": "doc",
            "_id": "2",
            "_score": 0.5254995,
            "_source": {
               "text": "apple, apple"
            }
         }
      ]
   }
}

但是,如果我增加到"min_term_freq"2(或更多),我什么也得不到,尽管我希望两个文件都被退回:

POST /test_index/_search
{
   "query": {
      "more_like_this": {
         "fields": [
            "text"
         ],
         "like_text": "apple",
         "min_term_freq": 2,
         "percent_terms_to_match": 1,
         "min_doc_freq": 1
      }
   }
}
...
{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 0,
      "max_score": null,
      "hits": []
   }
}

为什么?我错过了什么?

如果我想设置一个只返回"apple"出现 5 次而不返回出现 2 次的文档的查询,有没有更好的方法?

这是代码,为方便起见:

http://sense.qbox.io/gist/341f9f77a6bd081debdcaa9e367f5a39be9359cc

4

2 回答 2

9

在进行 MLT 之前,实际上在输入上应用了最小词频和最小文档频率。这意味着由于您的输入文本中只有一次出现 apple ,因此 apple 从未符合 MLT 的条件,因为 min term frequency 设置为 2。如果您将输入更改为“apple apple”,如下所示,一切都会奏效 -

POST /test_index/_search
{
   "query": {
      "more_like_this": {
         "fields": [
            "text"
         ],
         "like_text": "apple apple",
         "min_term_freq": 2,
         "percent_terms_to_match": 1,
         "min_doc_freq": 1
      }
   }
}

最小文档频率也是如此。Apple 在 atleast 2 document 中找到,因此 min_doc_freq upto 2 将有资格从输入文本中应用 MLT 操作。

于 2015-02-04T02:23:53.147 回答
3

作为这个问题的发布者,我也试图围绕 more_like_this 查询来思考......

我努力在网上找到好的信息来源,但是(在大多数情况下)文档似乎最有帮助,所以,这里是文档的链接,以及一些更重要的术语(和/或更难为了理解,所以我添加了我的解释):

max_query_terms- 将选择的查询词的最大数量(从每个输入文档中)。增加此值会以牺牲查询执行速度为代价提供更高的准确性。默认为 25。

min_term_freq- 最小词频,低于该词频将从输入文档中忽略。默认为 2。

如果词条在输入文档中出现少于 2 次(默认),它将从输入文档中被忽略,即不会在其他可能的more_like_this文档中搜索。

min_doc_freq- 从输入文档中忽略术语的最小文档频率。默认为 5。

这个花了我一秒钟的时间,所以,这是我的解释:

输入文档中的一个词必须出现在多少个文档中才能被选为查询词。

就是这样,我希望我能挽救一个人的生命几分钟。:)

干杯!

于 2019-09-21T18:43:01.217 回答