Здравствуйте, я использовал упругий поиск, но я бы хотел перейти на 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)
}