elasticsearch отключить подсчет частоты терминов

Я хочу изменить систему подсчета очков в elasticsearch, чтобы избавиться от подсчета многократного появления термина. Например, я хочу:

"техас, техас, техас"

а также

"Техас"

чтобы получить тот же результат. Я нашел это сопоставление, которое, по словам эластичного поиска, отключит подсчет частоты терминов, но мои поиски не дают такой же оценки:

"mappings":{
"business": {   
   "properties" : {
       "name" : {
          "type" : "string",
          "index_options" : "docs",
          "norms" : { "enabled": false}}
        }
    }
}

}

Любая помощь будет оценена по достоинству, я не смог найти много информации по этому вопросу.

Редактировать:

Я добавляю свой код поиска и то, что возвращается, когда я использую объяснение.

Мой код поиска:

Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "escluster").build();
    Client client = new TransportClient(settings)
    .addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));

    SearchRequest request =  Requests.searchRequest("businesses")
            .source(SearchSourceBuilder.searchSource().query(QueryBuilders.boolQuery()
            .should(QueryBuilders.matchQuery("name", "Texas")
            .minimumShouldMatch("1")))).searchType(SearchType.DFS_QUERY_THEN_FETCH);

    ExplainRequest request2 = client.prepareIndex("businesses", "business")

и когда я ищу с объяснением, я получаю:

  "took" : 14,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [ {
      "_shard" : 1,
      "_node" : "BTqBPVDET5Kr83r-CYPqfA",
      "_index" : "businesses",
      "_type" : "business",
      "_id" : "AU9U5KBks4zEorv9YI4n",
      "_score" : 1.0,
      "_source":{
"name" : "texas"
}
,
      "_explanation" : {
        "value" : 1.0,
        "description" : "weight(_all:texas in 0) [PerFieldSimilarity], result of:",
        "details" : [ {
          "value" : 1.0,
          "description" : "fieldWeight in 0, product of:",
          "details" : [ {
            "value" : 1.0,
            "description" : "tf(freq=1.0), with freq of:",
            "details" : [ {
              "value" : 1.0,
              "description" : "termFreq=1.0"
            } ]
          }, {
            "value" : 1.0,
            "description" : "idf(docFreq=2, maxDocs=3)"
          }, {
            "value" : 1.0,
            "description" : "fieldNorm(doc=0)"
          } ]
        } ]
      }
    }, {
      "_shard" : 1,
      "_node" : "BTqBPVDET5Kr83r-CYPqfA",
      "_index" : "businesses",
      "_type" : "business",
      "_id" : "AU9U5K6Ks4zEorv9YI4o",
      "_score" : 0.8660254,
      "_source":{
"name" : "texas texas texas"
}
,
      "_explanation" : {
        "value" : 0.8660254,
        "description" : "weight(_all:texas in 0) [PerFieldSimilarity], result of:",
        "details" : [ {
          "value" : 0.8660254,
          "description" : "fieldWeight in 0, product of:",
          "details" : [ {
            "value" : 1.7320508,
            "description" : "tf(freq=3.0), with freq of:",
            "details" : [ {
              "value" : 3.0,
              "description" : "termFreq=3.0"
            } ]
          }, {
            "value" : 1.0,
            "description" : "idf(docFreq=2, maxDocs=3)"
          }, {
            "value" : 0.5,
            "description" : "fieldNorm(doc=0)"
          } ]
        } ]
      }
    } ]
  }

Похоже, он все еще рассматривает частоту и частоту документов. Есть идеи? Извините за плохое форматирование, я не знаю, почему оно выглядит таким гротескным.

Изменить Изменить:

Мой код из поиска браузера http://localhost:9200/businesses/business/_search?pretty=true&qname=texas это:

    {
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "failed" : 0
  },
  "hits" : {
    "total" : 4,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "businesses",
      "_type" : "business",
      "_id" : "AU9YcCKjKvtg8NgyozGK",
      "_score" : 1.0,
      "_source":{"business" : {
"name" : "texas texas texas texas" }
}
    }, {
      "_index" : "businesses",
      "_type" : "business",
      "_id" : "AU9YateBKvtg8Ngyoy-p",
      "_score" : 1.0,
      "_source":{
"name" : "texas" }

    }, {
      "_index" : "businesses",
      "_type" : "business",
      "_id" : "AU9YavVnKvtg8Ngyoy-4",
      "_score" : 1.0,
      "_source":{
"name" : "texas texas texas" }

    }, {
      "_index" : "businesses",
      "_type" : "business",
      "_id" : "AU9Yb7NgKvtg8NgyozFf",
      "_score" : 1.0,
      "_source":{"business" : {
"name" : "texas texas texas" }
}
    } ]
  }
}

Он находит все 4 объекта, которые у меня есть, и у всех у них одинаковая оценка. Когда я запускаю свой поиск API Java с объяснением, я получаю:

    {
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.287682,
    "hits" : [ {
      "_shard" : 1,
      "_node" : "BTqBPVDET5Kr83r-CYPqfA",
      "_index" : "businesses",
      "_type" : "business",
      "_id" : "AU9YateBKvtg8Ngyoy-p",
      "_score" : 1.287682,
      "_source":{
"name" : "texas" }
,
      "_explanation" : {
        "value" : 1.287682,
        "description" : "weight(name:texas in 0) [PerFieldSimilarity], result of:",
        "details" : [ {
          "value" : 1.287682,
          "description" : "fieldWeight in 0, product of:",
          "details" : [ {
            "value" : 1.0,
            "description" : "tf(freq=1.0), with freq of:",
            "details" : [ {
              "value" : 1.0,
              "description" : "termFreq=1.0"
            } ]
          }, {
            "value" : 1.287682,
            "description" : "idf(docFreq=2, maxDocs=4)"
          }, {
            "value" : 1.0,
            "description" : "fieldNorm(doc=0)"
          } ]
        } ]
      }
    }, {
      "_shard" : 1,
      "_node" : "BTqBPVDET5Kr83r-CYPqfA",
      "_index" : "businesses",
      "_type" : "business",
      "_id" : "AU9YavVnKvtg8Ngyoy-4",
      "_score" : 1.1151654,
      "_source":{
"name" : "texas texas texas" }
,
      "_explanation" : {
        "value" : 1.1151654,
        "description" : "weight(name:texas in 0) [PerFieldSimilarity], result of:",
        "details" : [ {
          "value" : 1.1151654,
          "description" : "fieldWeight in 0, product of:",
          "details" : [ {
            "value" : 1.7320508,
            "description" : "tf(freq=3.0), with freq of:",
            "details" : [ {
              "value" : 3.0,
              "description" : "termFreq=3.0"
            } ]
          }, {
            "value" : 1.287682,
            "description" : "idf(docFreq=2, maxDocs=4)"
          }, {
            "value" : 0.5,
            "description" : "fieldNorm(doc=0)"
          } ]
        } ]
      }
    } ]
  }
}

person Chadvador    schedule 24.08.2015    source источник
comment
несоответствие, вероятно, больше связано с doc frequency, а не term frequency используете ли вы search_type=dfs_query_then_fetch . Если это не поможет, попробуйте установить explain=true в запросе, чтобы увидеть разбивку оценок.   -  person keety    schedule 25.08.2015
comment
Я переключил его на dfs_query_then_fetch, но это не сработало. Я опубликую свой код и объясню результаты через секунду   -  person Chadvador    schedule 25.08.2015
comment
не могли бы вы тоже опубликовать запрос?   -  person keety    schedule 25.08.2015
comment
Извините, что вы имеете в виду? Я просто выполняю SearchRequest сверху с помощью: ActionFuture af = client.search(request);   -  person Chadvador    schedule 25.08.2015
comment
И спасибо за правку форматирования!   -  person Chadvador    schedule 25.08.2015
comment
о, мой плохой, я не понял, что запрос находится во фрагменте кода, не могли бы вы распечатать фактический запрос dsl, который генерирует код, explain кажется, что запрос относится к полю _all   -  person keety    schedule 25.08.2015


Ответы (2)


Похоже, нельзя переопределить index options для поля после того, как поле было первоначально установлено в сопоставлении.

Пример:

put test
put test/business/_mapping
{

      "properties": {
         "name": {
            "type": "string",
           "index_options": "freqs",
            "norms": {
               "enabled": false
            }
         }
      }

}
put test/business/_mapping
{

      "properties": {
         "name": {
            "type": "string",
            "index_options": "docs",
            "norms": {
               "enabled": false
            }
         }
      }

}
get  test/business/_mapping

   {
   "test": {
      "mappings": {
         "business": {
            "properties": {
               "name": {
                  "type": "string",
                  "norms": {
                     "enabled": false
                  },
                  "index_options": "freqs"
               }
            }
         }
      }
   }
}

Вам нужно будет воссоздать индекс, чтобы подобрать новое сопоставление.

person keety    schedule 25.08.2015
comment
Ну, это смущает, это была моя собственная глупость, я тестировал, просто используя свой браузер с командой: localhost:9200/businesses/, после того, как я изменю его на qname=tex, поскольку он работает, оценки будут одинаковыми. Итак, почему это не работает с моим поиском API Java, где кажется, что я ищу поле имени? - person Chadvador; 25.08.2015
comment
не могли бы вы вставить весь фрагмент или, лучше, ответ с объяснением, установленным в клиенте Java - person keety; 25.08.2015
comment
Извините, я не знаю, как установить его в javaAPI, похоже, это не вариант с SearchRequest. Я обновлю свой OP с кодом. - person Chadvador; 25.08.2015
comment
Я перешел на SearchResponse, чтобы иметь возможность использовать объяснение, снова обновить OP и перезаписать предыдущее редактирование. Похоже, когда я использую java API, он не затрагивает настройки, которые должны игнорировать частоты. - person Chadvador; 25.08.2015
comment
странно, не могли бы вы попробовать это http://localhost:9200/businesses/business/_search?pretty=true&q=name:texas&search_type=dfs_query_then_fetch&explain=true в браузере и посмотреть, получите ли вы тот же результат? У меня есть ощущение, что сопоставление не было применено или было применено после индексации документов. - person keety; 25.08.2015
comment
Этот новый поиск дает мне те же результаты, что и мой Java API. А что касается сопоставлений, почему он работает для одного поиска, но не для другого, когда он находится в тех же документах? Я устанавливаю сопоставление перед индексацией чего-либо. - person Chadvador; 25.08.2015
comment
предыдущий http://localhost:9200/businesses/business/_search?pretty=true&qname=texas имеет неправильный синтаксис, и, к сожалению, elasticsearch вместо того, чтобы выдавать ошибку, игнорирует неправильные параметры URL. По умолчанию он равен match all . По этой причине все документы имеют одинаковую оценку. Вы можете попробовать с http://localhost:9200/businesses/business/_search?pretty=true&qname=thiscannotbeinthedocument и вы должны получить тот же результат, что и предыдущий. похоже, что сопоставление было применено неправильно, попробуйте http://localhost:9200/businesses/business/_mapping - person keety; 25.08.2015
comment
Ничего себе, вы правы во всех отношениях, похоже... те же результаты, и текущее сопоставление - это не то, что я вставил, это похоже на назначение по умолчанию, которое дает elasticsearch. Когда я отправляю сопоставление, оно дает мне хороший ответ, я не помню, что именно, но это что-то вроде «подтверждено: правда». Может я не туда ставлю? - person Chadvador; 25.08.2015
comment
Вы на что-то, обновленный ответ на самом деле выглядит так, как будто после создания индекса и поля, указанного в сопоставлении, вы не можете переопределить его с помощью вызова сопоставления. Не думаю, что это упоминается в документах, поэтому, вероятно, вы можете поднять проблему с elasticsearch, так как он должен как минимум выдавать ошибку, а не молчать - person keety; 25.08.2015
comment
Я просто использую его в тестовом эластичном поиске прямо сейчас, поэтому я удаляю индекс, добавляю сопоставление с предприятиями, а затем добавляю небольшие тестовые объекты. Есть ли что-то другое, что я могу сделать при первоначальном добавлении сопоставления? - person Chadvador; 25.08.2015
comment
Вы были правы, я использовал неправильный способ нанести его на карту. Я обновлю свой пост выше с моей рабочей картой, большое спасибо!! - person Chadvador; 25.08.2015
comment
Есть ли способ добавить index_options : freqs ко всем полям, а не только к полю имени? Я ищу что-то вроде * вместо имени - person user3071643; 03.10.2016
comment
должен быть в состоянии достичь этого, используя динамические шаблоны - person keety; 04.10.2016

ваш тип поля должен быть текстовым

вы должны переиндексировать elasticsearch - создайте новый индекс

"mappings": {
    "properties": {
      "text": {
        "type": "text",
        "index_options": "docs"
      }
    }
  }

https://www.elastic.co/guide/en/elasticsearch/reference/current/index-options.html

person Milija B    schedule 30.05.2021