elasticsearch 在JavaLucene上模拟弹性搜索索引和查询,elasticsearch,lucene,elasticsearch,Lucene" /> elasticsearch 在JavaLucene上模拟弹性搜索索引和查询,elasticsearch,lucene,elasticsearch,Lucene" />

elasticsearch 在JavaLucene上模拟弹性搜索索引和查询

elasticsearch 在JavaLucene上模拟弹性搜索索引和查询,elasticsearch,lucene,elasticsearch,Lucene,您好,我使用的是弹性搜索,但我想迁移到JavaLucene 我需要的是以相同的方式重新创建索引,并以相同的方式重新创建查询。我认为我做到了,但我从查询中得到的分数并不完全相同。结果非常相似,但结果本身的分数不同。也许我错过了什么。我找不到足够的信息,默认的弹性设置在Lucene中是等效的 我已检查我的Lucene版本是否与我使用的弹性搜索相同 我将向您展示我在elastic中的配置,以及我如何在Lucene上复制它 这是用于创建索引的弹性搜索连接器: "analysis": { "anal

您好,我使用的是弹性搜索,但我想迁移到JavaLucene

我需要的是以相同的方式重新创建索引,并以相同的方式重新创建查询。我认为我做到了,但我从查询中得到的分数并不完全相同。结果非常相似,但结果本身的分数不同。也许我错过了什么。我找不到足够的信息,默认的弹性设置在Lucene中是等效的

我已检查我的Lucene版本是否与我使用的弹性搜索相同

我将向您展示我在elastic中的配置,以及我如何在Lucene上复制它

这是用于创建索引的弹性搜索连接器:

"analysis": {
   "analyzer": {
            "default": {           
               "tokenizer": "standard",           
                "filter":  [ "lowercase", "asciifolding" ]
             }
    }     
}
以下是我的问题:

问题1)

问题2)

下面是Scala代码:

创建Lucene索引时,这些是我的
field1、field2和field3
选项:

 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(新字段(“field1”,field1Value,CustomStringFieldType))
将字段添加到文档中

这是我的疑问。我使用标准Analyzer和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)
   }
def query1(标记:Seq[String]):查询={
var booleanQueryBuilder=new BooleanQuery.Builder()

对于(token而言,明显的区别在于映射设置

当您被选中在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\u vector
-默认情况下禁用,因此您需要

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "text": {
          "type":        "text",
          "term_vector": "with_positions"
        }
      }
    }
  }
}
像你在Lucene那样储存职位


因此,既然您要迁移到Lucene,您需要禁用术语向量,就像在Elasticsearch中一样

非常感谢您注意到这一点。不幸的是,这并没有显著改变分数。
fieldType.setStoreTermVectors(true)
fieldType.setStoreTermVectorPositions(true)
fieldType.setOmitNorms(false)
fieldType.setTokenized(true)
fieldType.setStored(false)
fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS)
PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "text": {
          "type":        "text",
          "term_vector": "with_positions"
        }
      }
    }
  }
}