Имитация эластичного поискового индекса и запросов на Java Lucene - PullRequest
0 голосов
/ 24 января 2019

Здравствуйте, я использовал упругий поиск, но я бы хотел перейти на Java Lucene.

Что мне нужно, это воссоздать индекс таким же образом и пересоздать запросы таким же образом. Я хоть и сделал это, но оценки, которые я получаю по запросам, не совсем совпадают. Результаты довольно похожи, но оценка самого результата отличается. Может быть, я что-то упустил. Я не могу найти достаточно информации, и эластичные настройки по умолчанию являются их эквивалентами в Lucene.

Я проверил, что моя версия Lucene такая же, как в упругом поиске, который я использовал

Я покажу вам мои конфигурации в упругом виде и как я воспроизвожу их в Lucene.

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

"analysis": {
   "analyzer": {
            "default": {           
               "tokenizer": "standard",           
                "filter":  [ "lowercase", "asciifolding" ]
             }
    }     
}

Это мои запросы:

Query1)

 "query": {
      "dis_max": {
           "queries": [
                { "match": { "field1": "${term}" }}
           ],
      "tie_breaker": 1
     }
 }

Запрос 2)

 "query": {
      "dis_max": {
           "queries": [
                { "match": { "field1": "${term}" }},
                { "match": { "field2": "${term}" }},
                { "match": { "field2":  "${term}" }}
           ],
           "tie_breaker": 1
      }
 }

Ниже приведен код Scala:

Это мои field1, field2 and field3 опции при создании индекса Lucene:

 val CustomStringFieldType: FieldType = {
     val fieldType = new FieldType()
     fieldType.setStoreTermVectors(true)
     fieldType.setStoreTermVectorPositions(true)
     fieldType.setOmitNorms(false)
     fieldType.setTokenized(true)
     fieldType.setStored(false)
     fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS)
     fieldType.freeze()
     fieldType
   }

Я использую doc.add(new Field("field1", field1Value, CustomStringFieldType)) для добавления полей в документ.

Это мои запросы. Я создаю токены с помощью стандартного анализатора и использую алгоритм подобия BM25:

  def query1(tokens: Seq[String]): Query = {

     var booleanQueryBuilder = new BooleanQuery.Builder()

     for (token <- tokens) {
       booleanQueryBuilder = booleanQueryBuilder.add(
         new TermQuery(new Term("field1", token)),
         BooleanClause.Occur.SHOULD)
     }
     booleanQueryBuilder.build()
   }

 def query2(tokens: Seq[String]): Query = {

     val queries = new java.util.ArrayList[Query]()

     for (field <- ("field1", "field2", "field3") {

       var booleanQueryBuilder = new BooleanQuery.Builder()

       for (token <- tokens) {
         booleanQueryBuilder = booleanQueryBuilder.add(
           new TermQuery(new Term(field, token)),
           BooleanClause.Occur.SHOULD)
       }

       val booleanQuery: BooleanQuery = booleanQueryBuilder.build()
       queries.add(booleanQuery)
     }
     new DisjunctionMaxQuery(queries, broadQueryTieBreaker)
   }

1 Ответ

0 голосов
/ 25 января 2019

Разница заключается в ваших настройках сопоставления.

Если в Lucene выбрано следующее:

fieldType.setStoreTermVectors(true)
fieldType.setStoreTermVectorPositions(true)
fieldType.setOmitNorms(false)
fieldType.setTokenized(true)
fieldType.setStored(false)
fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS)

По умолчанию в Elasticsearch:

term_vector - по умолчанию отключено, поэтому вам нужно иметь

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "text": {
          "type":        "text",
          "term_vector": "with_positions"
        }
      }
    }
  }
}

Для хранения позиций, которые вы делаете в Lucene.

Итак, поскольку вы переходите на Lucene, вам нужноотключить векторы терминов, как они были в вашем Elasticsearch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...