Cutoff_frequency


(Дмитрий Белоус) #1

Доброго времени суток!

У меня в индексе есть две записи:

"hits": [
     {
        "_index": "test",
        "_type": "test",
        "_id": "1",
        "_score": 1,
        "_source": {
           "text": "Quick and the dead"
        }
     },
     {
        "_index": "test",
        "_type": "test",
        "_id": "2",
        "_score": 1,
        "_source": {
           "text": "and the"
        }
     }
  ]

Рассмотрим запрос:

POST test/test/_search
{
    "query": {
        "match": {
            "text" : {
                "query" : "Quick and the dead",
                "cutoff_frequency" : 0.6
            }
        }
    }
}

Он выдаёт два результата, хотя согласно статье https://www.elastic.co/guide/en/elasticsearch/guide/current/common-terms.html
должен быть аналогичным запросу

POST test/test/_search
{
    "query": {
      "bool": {
        "must": { 
          "bool": {
            "should": [
              { "term": { "text": "quick" }},
              { "term": { "text": "dead"  }}
            ]
          }
        },
        "should": { 
          "bool": {
            "should": [
              { "term": { "text": "and" }},
              { "term": { "text": "the" }}
            ]
          }
        }
      }
    }
}

Что не так? Заранее спасибо.


(Igor Motov) #2

Попробуйте запустить запрос с search_type=dfs_query_then_fetch. Возможно, что у Вас каждая запись на своей шарде находится, а по умолчанию частота рассчитывается на каждой шарде отдельно. Когда записей много - это работает. А вот во время экспериментов с 2-мя записями, как у Вас, получается что у всех слов одна и та же частота.


(Дмитрий Белоус) #3

Сработало так же, но причина, скорее всего, верная, спасибо.


(Дмитрий Белоус) #4

Вот такие пояснения выдаются по второму результату:

...
"_explanation": {
   "value": 0.2562107,
   "description": "product of:",
   "details": [
	  {
		 "value": 0.5124214,
		 "description": "sum of:",
		 "details": [
			{
			   "value": 0.2562107,
			   "description": "weight(text:and in 0) [PerFieldSimilarity], result of:",
			   "details": [
				  {
					 "value": 0.2562107,
					 "description": "score(doc=0,freq=1.0), product of:",
					 "details": [
						{
						   "value": 0.40993714,
						   "description": "queryWeight, product of:",
						   "details": [
							  {
								 "value": 1,
								 "description": "idf(docFreq=2, maxDocs=3)"
							  },
							  {
								 "value": 0.40993714,
								 "description": "queryNorm"
							  }
						   ]
						},
						{
						   "value": 0.625,
						   "description": "fieldWeight in 0, product of:",
						   "details": [
							  {
								 "value": 1,
								 "description": "tf(freq=1.0), with freq of:",
								 "details": [
									{
									   "value": 1,
									   "description": "termFreq=1.0"
									}
								 ]
							  },
							  {
								 "value": 1,
								 "description": "idf(docFreq=2, maxDocs=3)"
							  },
							  {
								 "value": 0.625,
								 "description": "fieldNorm(doc=0)"
							  }
						   ]
						}
					 ]
				  }
			   ]
			},
...

Видимо, maxDocs не может быть меньше 3?


(Igor Motov) #5

Похоже, что проблема в том, как cutoff_frequency используется тут. При округлении (int) Math.ceil(maxTermFrequency * (float) maxDoc) равнятся 2 для всех токенов. Все работает нормально с "cutoff_frequency": 0.4, например.


(Дмитрий Белоус) #6

Спасибо!


(system) #7