将Lucene搜索集成到应用程序中

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。

在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中,以提供强大的搜索功能。 在这里查看 !

目录

1.简介 2.解析查询字符串
2.1。 QueryParser的规则 2.2。 使用QueryParser 2.3。 QueryParser表达式语法
3.使用索引搜索器创建索引 4.不同类型的查询
4.1术语查询 4.2布尔查询 4.3通配符查询 4.4短语查询 4.5前缀查询 4.6 MultiPhraseQuery 4.7模糊查询 4.8 RegexpQuery 4.9 TermRangeQuery 4.10 NumericRangeQuery 4.11 ConstantScoreQuery 4.12 DisjunctionMaxQuery 4.13 MatchAllDocsQuery

1.简介

Java Lucene提供了一种功能非常强大的查询语言,用于对大量数据执行搜索操作。

查询分为术语和运算符。 术语共有三种: 单项短语子查询 。 单个术语是一个单词,例如“ test”或“ hello”。 短语是一组用双引号括起来的单词,例如“ hello dolly”。 子查询是用括号括起来的查询,例如“(hello dolly)”。

Lucene支持数据字段。 执行搜索时,您可以指定一个字段,也可以使用默认字段。 字段名称取决于索引数据,默认字段由当前设置定义。

2.解析查询字符串

查询解析器的工作是将用户提交的查询字符串转换为查询对象。

查询由解析器解析其内容。 这是一个例子:

{"query_string" : {"default_field" : "content","query" : "this AND that OR thus"}
}

query_string顶级参数包括:

参数 描述
query 要解析的实际查询。
default_field 如果未指定前缀字段,则为查询词的默认字段。 默认为index.query.default_field索引设置,而索引设置又默认为_all。
default_operator 如果未指定显式运算符,则使用默认运算符。 例如,使用OR的默认运算符,匈牙利的查询大写被转换为OR匈牙利的大写OR,使用AND的默认运算符,相同的查询被转换为AND匈牙利的大写AND。 默认值为“或”。
analyzer 用于分析查询字符串的分析器名称。
allow_leading_wildcard 设置时,*或? 允许作为第一个字符。 默认为true。
lowercase_expanded_terms 通配符,前缀,模糊和范围查询的术语是否要自动小写(因为未对其进行分析)。 默认为true。
enable_position_increments 设置为true以在结果查询中启用位置增量。 默认为true。
fuzzy_max_expansions 控制模糊查询将扩展到的术语数量。 默认为50
fuzziness 设置模糊查询的模糊性。 默认为自动。
fuzzy_prefix_length 设置模糊查询的前缀长度。 默认值为0。
phrase_slop 设置短语的默认斜率。 如果为零,则需要精确的短语匹配。 预设值为0。
boost 设置查询的提升值。 默认为1.0。
analyze_wildcard 默认情况下,不分析查询字符串中的通配符术语。 通过将此值设置为true,也将尽最大努力对这些值进行分析。
auto_generate_phrase_queries 默认为false。
minimum_should_match 一个值,该值控制在结果布尔查询中应匹配多少个“应该”子句。 它可以是绝对值(2),百分比(30%)或两者的组合。
lenient 如果设置为true,将导致忽略基于格式的错误(例如,向数字字段提供文本)。
locale [1.1.0]在1.1.0.Locale中添加,应用于字符串转换。 默认为ROOT。

表格1

生成多词查询时,可以使用rewrite参数控制如何重写它。

QueryParser的规则

假设您正在Web上搜索同时包含单词java和net但不包含单词dot的页面。 如果搜索引擎让您为此简单查询输入类似以下内容,该怎么办?

BooleanQuery query = new BooleanQuery();
query.add(new TermQuery(new Term("contents","java")), true, false);
query.add(new TermQuery(new Term("contents", "net")), true, false);
query.add(new TermQuery(new Term("contents", "dot")), false, true);

那将是真正的阻力。 幸运的是,Google,Nutch和其他搜索引擎比这更友好,允许您输入更简洁的内容: java AND net NOT dot 。首先,我们将了解在应用程序中使用QueryParser涉及的内容。

使用QueryParser

使用QueryParser非常简单。 需要三件事:表达式,用于表达式中非限定字段的默认字段名称以及用于分析表达式片段的分析器。字段选择限定符在查询语法部分中讨论。 “分析瘫痪”部分介绍了特定于查询解析的分析。 现在,让我们分析一个表达式:

String humanQuery = getHumanQuery();
Query query = QueryParser.parse(humanQuery, "contents", new StandardAnalyzer());

一旦获得Query对象,就可以像直接通过API创建查询一样进行搜索。 这是使用用户输入的查询字符串搜索现有索引并将结果显示到控制台的完整方法:

public static void search(File indexDir, String q) throws Exception{
Directory fsDir = FSDirectory.getDirectory(indexDir, false);IndexSearcher is = new IndexSearcher(fsDir);Query query = QueryParser.parse(q, "contents", new StandardAnalyzer());Hits hits = is.search(query);System.out.println("Found " + hits.length() +" document(s) that matched query '" + q + "':");for (int i = 0; i < hits.length(); i++) {Document doc = hits.doc(i);System.out.println(doc.get("filename"));}
}

根据简单的语法分析传递给QueryParser表达式。 遇到非法表达式时, QueryParser引发ParseException

QueryParser表达式语法

本节中的以下各项描述QueryParser支持创建各种查询类型的语法。

单项查询

仅一个单词的查询字符串将转换为基础TermQuery

词组查询

要在一个字段中一起搜索一组单词,请用双引号将单词引起来。 查询“ hello world”对应于精确的词组匹配,要求“ hello”和“ world”是匹配的连续项。 Lucene还支持草率的短语查询,其中引号之间的术语不必严格按顺序排列。 斜率因子衡量将术语重新排列为准确顺序需要执行多少步。 如果移动次数小于指定的倾斜系数,则为匹配。 QueryParser将表达式“ hello world” PhraseQuery解析为PhraseQuery ,其PhraseQuery因子为2,允许对短语“ world hello”,“ hello world”,“ hello * world”和“ hello * * world”进行匹配,其中星号表示索引中不相关的单词。 请注意,“ world * hello”与坡度因子2不匹配。因为将其返回“ hello world”的步数为3。将“ world”一词跳到星号位置是一个,到“你好”位置是两个,第三跳完全匹配。

范围查询

文本或日期范围查询使用带括号的语法,在开始词和结束词之间使用TO。 方括号的类型确定范围是包含式(方括号)还是排他性(卷曲方括号)。

注意:非日期范围查询在用户输入时不加修改地使用开始和结束词。 在{Aardvark TO Zebra}的情况下,这些术语不小写。 起始词和结束词不得包含空格,否则解析会失败; 只允许使用单个单词。 分析器未按开始和结束条件运行。

日期范围处理

当遇到范围查询(例如[1/1/03 TO 12/31/03])时,解析器代码首先尝试将开始和结束条件转换为日期。 如果这些术语是有效日期,则根据DateFormat.SHORT和宽大的解析,则日期将转换为其内部文本表示形式(但是,日期字段索引已超出本文的范围)。 如果这两个术语中的任何一个未能解析为有效日期,则它们都将原样用于文本范围。

通配符和前缀查询

如果一个术语包含星号或问号,则将其视为WildcardQuery ,除非该术语仅包含尾部星号,而QueryParser会将其优化为PrefixQuery 。 尽管WildcardQuery API本身支持前导通配符,但QueryParser不允许使用它。 通配符查询示例是w * ldc?rd ,而查询前缀*已优化为PrefixQuery

模糊查询

Lucene的FuzzyQuery匹配接近指定术语的术语。 Levenshtein距离算法确定索引中的词与指定目标词的接近程度。 “编辑距离”是“ Levenshtein距离”的另一个术语,是两个字符串之间相似度的量度,其中距离的测量是将一个字符串转换为另一个字符串所需的字符删除,插入或替换的数量。 例如,“三”和“树”之间的编辑距离是一,因为仅需要删除一个字符。 在阈值计算中使用移动数,该计算是距离与弦长的比率。 QueryParser支持在词条上使用尾随波浪号的模糊词条查询。 例如,搜索wuzza〜将找到包含“ fuzzy”和“ wuzzy”的文档。 编辑距离会影响得分,例如,较低的编辑距离会得分较高。

布尔查询

使用运算符AND,OR和NOT在文本上构造布尔查询。 列出的未指定运算符的术语使用隐式运算符,默认情况下为OR。 abc xyz的查询将解释为abc OR xyz。 在术语前加上NOT排除包含以下术语的文档。 否定项必须与至少一个非否定项组合才能返回文档。 下表中显示了每个大写单词运算符的快捷方式语法。

a OR ba ba,而不是b + a -b

详细语法 快捷语法
a和b + a + b

表格1

QueryParser是一种快速简便的方法,可为用户提供强大的查询构造,但并不适合所有人。 QueryParser无法创建可以使用API​​构造的每种查询。 例如,不能构造PhrasePrefixQuery 。 您必须记住,将自由格式查询解析提供给最终用户时,所有可用的可能性。 某些查询可能会导致性能瓶颈。 内置QueryParser使用的语法可能不适合您的需求。 子类化QueryParser可以实现某些控制,尽管它仍然受到限制。

3.使用索引搜索器创建索引

通常,应用程序通常只需要调用继承的

Searcher.search(org.apache.lucene.search.Query,int)

要么

Searcher.search(org.apache.lucene.search.Query,org.apache.lucene.search.Filter,int)

方法。 为了提高性能,我们可以打开indexSearcher其用于所有其他搜索操作。 这是一个简单的示例,说明如何在lucene中创建索引并使用indexSearcher搜索该索引。

public void simpleLucene(){Analyzer analyzer = new StandardAnalyzer();// Store the index in memory:Directory directory = new RAMDirectory();// To store an index on disk, use this instead (note that the // parameter true will overwrite the index in that directory// if one exists):// Directory directory = FSDirectory.getDirectory("/tmp/myfiles", true);IndexWriter iwriter = new IndexWriter(directory, analyzer, true);iwriter.setMaxFieldLength(25000);Document doc = new Document();String text = "This is the text to be indexed.";doc.add(new Field("fieldname", text, Field.Store.YES,Field.Index.TOKENIZED));iwriter.addDocument(doc);iwriter.close();// Now search the index:IndexSearcher isearcher = new IndexSearcher(directory);// Parse a simple query that searches for "text":QueryParser parser = new QueryParser("fieldname", analyzer);Query query = parser.parse("text");Hits hits = isearcher.search(query);assertEquals(1, hits.length());// Iterate through the results:for (int i = 0; i < hits.length(); i++){Document hitDoc = hits.doc(i);assertEquals("This is the text to be indexed.", hitDoc.get("fieldname"));}isearcher.close();directory.close();}

4.不同类型的查询

Lucene支持多种查询。 这里是其中的一些。

  1. 术语查询
  2. 布尔查询
  3. 通配符查询
  4. 词组查询
  5. 前缀查询
  6. 多词查询
  7. 模糊查询
  8. 正则表达式查询
  9. TermRangeQuery
  10. NumericRangeQuery
  11. ConstantScoreQuery
  12. DisjunctionMaxQuery
  13. MatchAllDocsQuery

4.1术语查询

匹配具有包含术语(未分析)的字段的文档。 术语查询映射到Lucene TermQuery 。 以下匹配文档,其中用户字段包含术语kimchy

{"term" : { "user" : "kimchy" }
}

提升也可以与查询关联:

{"term" : { "user" : { "value" : "kimchy", "boost" : 2.0 } }
}

要么 :

{"term" : { "user" : { "term" : "kimchy", "boost" : 2.0 } }
}

使用Lucene,可以搜索已使用TermQuery类建立索引的特定单词。 本教程将把TermQuery搜索与QueryParser搜索进行比较,并显示术语查询所涉及的一些细微差别。

4.2布尔查询

我们可以使用BooleanQuery API或使用MultiFieldQueryParser在Lucene中运行多字段搜索来解析查询文本。 例如,如果索引具有2个字段FirstNameLastName并且如果您需要在FirstName字段中搜索“ John”,在LastName字段中搜索“ Travis”,则可以使用BooleanQuery这样:

BooleanQuery bq = new BooleanQuery();
Query qf = new TermQuery(new Lucene.Net.Index.Term("FirstName", "John"));
Query ql = new TermQuery(new Lucene.Net.Index.Term("LastName", "Travis"));
bq.Add(qf, BooleanClause.Occur.MUST);
bq.Add(ql, BooleanClause.Occur.MUST);
IndexSearcher srchr = new IndexSearcher(@"C:\\indexDir");
srchr.Search(bq);

4.3通配符查询

匹配具有与通配符表达式匹配(未分析)的字段的文档。 支持的通配符是*,它匹配任何字符序列(包括空字符),以及?,它匹配任何单个字符。 请注意,此查询可能会很慢,因为它需要迭代许多项。 为了防止极慢的通配符查询,通配符术语不应以通配符*或?之一开头。 通配符查询映射到Lucene WildcardQuery。

{"wildcard" : { "user" : "ki*y" }
}

提升也可以与查询关联:

{"wildcard" : { "user" : { "value" : "ki*y", "boost" : 2.0 } }
}

要么 :

{"wildcard" : { "user" : { "wildcard" : "ki*y", "boost" : 2.0 } }
}

该多项查询允许控制如何使用rewrite参数将其重写。

4.4短语查询

使用Lucene, PhaseQuery可以用于查询一系列术语,其中这些术语不一定必须彼此相邻或按顺序排列。 PhaseQuery对象的setSlop()方法可用于设置查询短语中各个单词之间可以包含多少个单词。

我们可以这样使用PhraseQuery

Term term1 = new Term(FIELD_CONTENTS, string1);
Term term2 = new Term(FIELD_CONTENTS, string2);
PhraseQuery phraseQuery = new PhraseQuery();
phraseQuery.add(term1);
phraseQuery.add(term2);
phraseQuery.setSlop(slop);

4.5前缀查询

匹配具有包含带有指定前缀(未分析)的术语的字段的文档。 前缀查询映射到Lucene PrefixQuery 。 以下匹配文档,其中用户字段包含以ki开头的术语:

{"prefix" : { "user" : "ki" }
}

提升也可以与查询关联:

{"prefix" : { "user" :  { "value" : "ki", "boost" : 2.0 } }
}

要么 :

{"prefix" : { "user" :  { "prefix" : "ki", "boost" : 2.0 } }
}

该多项查询允许控制如何使用rewrite参数将其重写。

4.6 MultiPhraseQuery

内置的MultiPhraseQuery绝对是一种利基查询,但它可能很有用。 MultiPhraseQueryPhraseQuery只是它允许每个职位使用多个词。 您可以通过枚举所有可能的短语组合并使用BooleanQuery将它们“或”在一起来实现相同的逻辑效果,尽管以高性能为代价。

例如,假设我们要查找有关快速狐狸的所有文档,快速或快速后跟狐狸。 一种方法是执行“快速狐狸”或“快速狐狸”查询。 另一个选择是使用MultiPhraseQuery

4.7模糊查询

FuzzyQuery可以分为两种,一种。 像这样的查询模糊&b。 像这样的字段查询模糊。 像这样的查询模糊–像这样的查询模糊,通过在一个或多个字段上运行来查找与提供的文本“相似”的文档。

{"fuzzy_like_this" : {"fields" : ["name.first", "name.last"],"like_text" : "text like this one","max_query_terms" : 12}
}

Fuzzy_like_this可以缩短为flt。
Fuzzy_like_this顶级参数包括:

  • fields ->要对其运行类似查询的字段列表。 默认为_all字段。
  • like_text >用于查找喜欢的文档的文本。
  • ignore_tf >应该忽略词频。 默认为false。
  • max_query_terms >任何生成的查询中将包含的最大查询词数。 默认为25。
  • fuzziness ->术语变体的最小相似性。 默认值为0.5。 请参阅“模糊编辑”一节。
  • prefix_length >变体术语上必需的公共前缀的长度。 预设为0。
  • boost >设置查询的增强值。 默认为1.0。
  • analyzer >将用于分析文本的分析器。 默认为与该字段关联的分析器。

模糊化所有以字符串形式提供的术语,然后选择最佳的n个差异术语。 实际上,这混合了FuzzyQueryMoreLikeThis的行为,但要特别考虑模糊评分因素。 这通常为查询产生良好的结果,其中用户可以在多个字段中提供详细信息,并且不了解布尔查询语法,并且还需要一定程度的模糊匹配和快速查询。

对于每个源项,模糊变体都保存在没有BooleanQuery因子的BooleanQuery (因为我们不在任何文档中寻找多个变体的匹配项)。 此外,专门的TermQuery用于变体,并且不使用该变体词的IDF,因为这会偏爱诸如拼写错误之类的罕见词。 取而代之的是,所有变体都使用相同的IDF排名(源查询项的排名),这是变体的提升因素。 如果索引中不存在源查询词,则使用变体的平均IDF。b。 像这样的字段查询模糊

Fuzzy_like_this_field查询与Fuzzy_like_this查询相同,只不过它针对单个字段运行。 它提供了比一般Fu​​zzy_like_this查询更好的查询DSL,并支持类型字段查询(使用类型过滤器自动包装类型字段以仅匹配特定类型)。

{"fuzzy_like_this_field" : {"name.first" : {"like_text" : "text like this one","max_query_terms" : 12}}
}

可以将Fuzzy_like_this_field缩短为flt_field。Fuzzy_like_this_field顶级参数包括:

  • like_text->用于查找喜欢的文档的文本。
  • ignore_tf->应该忽略词频。 默认为false。
  • max_query_terms->任何生成的查询中将包含的最大查询词数。 默认为25。
  • 模糊性->术语变体的模糊性。 默认值为0.5。 请参阅“模糊编辑”一节。
  • prefix_length->变体术语上必需的公共前缀的长度。 预设为0。
  • boost->设置查询的增强值。 默认为1.0。
  • Analyzer->将用​​于分析文本的分析器。 默认为与该字段关联的分析器。

4.8 RegexpQuery

regexp查询允许您使用正则表达式术语查询。 有关受支持的正则表达式语言的详细信息,请参见正则表达式语法。

注意: regexp查询的性能在很大程度上取决于所选的正则表达式。 匹配。*之类的内容非常慢,而且无法使用环视正则表达式。 如果可能,应在正则表达式开始之前尝试使用长前缀。 诸如。*?+之类的通配符匹配器通常会降低性能。

{"regexp":{"name.first": "s.*y"}
}

还支持升压

{"regexp":{"name.first":{"value":"s.*y","boost":1.2}}
}

您还可以使用特殊标志

{"regexp":{"name.first": {"value": "s.*y","flags" : "INTERSECTION|COMPLEMENT|EMPTY"}}
}

可能的标志是ALLANYSTRINGAUTOMATONCOMPLEMENTEMPTYINTERSECTIONINTERVALNONE 。 正则表达式查询受regexp和query_string查询的支持。 Lucene正则表达式引擎不兼容Perl,但支持较小范围的运算符。

标准运营商

锚定大多数正则表达式引擎允许您匹配字符串的任何部分。 如果您想让正则表达式模式从字符串的开头开始或在字符串的末尾结束,则必须专门将其锚定,使用^表示开始或使用$表示结束.Lucene的模式始终被锚定。 提供的模式必须与整个字符串匹配。 对于字符串“ abcde”

ab.* # match
abcd # no match

允许的字符

模式中可以使用任何Unicode字符,但是某些字符是保留的,必须转义。 标准保留字符为:

。 ? + * | {} []()” \

如果启用了可选功能(请参见下文),则这些字符也可能被保留:

#@&<>〜

任何保留的字符都可以使用反斜杠“ \ *”进行转义,包括文字反斜杠字符:

“ \\”

此外,任何字符(双引号除外)在被双引号括起来时都将按字面意义进行解释:

约翰” @ smith.com”

匹配任何字符

时期 ”。” 可以用来代表任何字符。 对于字符串“ abcde”:

ab... # match
a.c.e # match

一个或多个

加号“ +”可用于一次或多次重复前面的最短模式。 对于字符串“ aaabbb”:

a+b+ # match
aa+bb+ # match
a+.+ # match
aa+bbb+ # no match

零或更多

星号“ *”可用于匹配前面的最短模式零次或多次。 对于字符串“ aaabbb”:

a*b* # match
a*b*c* # match
.*bbb.* # match
aaa*bbb* # match

零或一

问号“?” 使前面的最短模式为可选。 它匹配零或一倍。 对于字符串“ aaabbb”:

aaa?bbb? # match
aaaa?bbbb? # match
.....?.? # match
aa?bb? # no match

最小到最大

可以使用花括号“ {}”指定前面的最短模式可以重复的最小次数和(可选)最大次数。 允许的形式为:

{5} # repeat exactly 5 times
{2,5} # repeat at least twice and at most 5 times
{2,} # repeat at least twice

对于字符串“ aaabbb”:

a{3}b{3} # match
a{2,4}b{2,4} # match
a{2,}b{2,} # match
.{3}.{3} # match
a{4}b{4} # no match
a{4,6}b{4,6} # no match
a{4,}b{4,} # no match

分组

括号“()”可用于形成子模式。 上面列出的数量运算符以最短的先前模式进行操作,该模式可以是一组。 对于字符串“ ababab”:

(ab)+ # match
ab(ab)+ # match
(..)+ # match
(...)+ # no match
(ab)* # match
abab(ab)? # match
ab(ab)? # no match
(ab){3} # match
(ab){1,2} # no match

轮换

管道符号“ |” 充当OR运算符。 如果左侧或右侧的图案匹配,则匹配成功。 交替适用于最长的模式,而不是最短的模式。 对于字符串“ aabb”:

aabb|bbaa # match
aacc|bb # no match aa(cc|bb) # match
a+|b+ # no match
a+b+|b+a+ # match
a+(b|c)+ # match

角色类

潜在字符的范围可以通过将它们括在方括号“ []”中来表示为字符类。 前导^否定字符类。 允许的形式为:

[abc] # 'a' or 'b' or 'c'
[a-c] # 'a' or 'b' or 'c'
[-abc] # '-' or 'a' or 'b' or 'c'
[abc\\-] # '-' or 'a' or 'b' or 'c'
[^a-c] # any character except 'a' or 'b' or 'c'
[^a-c] # any character except 'a' or 'b' or 'c'
[-abc] # '-' or 'a' or 'b' or 'c'
[abc\\-] # '-' or 'a' or 'b' or 'c'

请注意,破折号“-”表示字符范围,除非它是第一个字符或用反斜杠转义。对于字符串“ abcd”:

ab[cd]+ # match
[a-d]+ # match
[^a-d]+ # no match

4.9 TermRangeQuery

一个Query ,该Query匹配一系列术语内的文档。 此查询寻找字词落入根据提供的范围中的文件相匹配String#compareTo(String) ,除非一个Collator被提供。 它不适用于数字范围。

这是一个如何在lucene中使用TermRangeQuery的示例,

private Query createQuery(String field, DateOperator dop) throws UnsupportedSearchException {
Date date = dop.getDate();
DateResolution res = dop.getDateResultion();
DateTools.Resolution dRes = toResolution(res);
String value = DateTools.dateToString(date, dRes);
switch(dop.getType()) {case ON:return new TermQuery(new Term(field ,value));case BEFORE: return new TermRangeQuery(field, DateTools.dateToString(MIN_DATE, dRes), value, true, false);case AFTER: return new TermRangeQuery(field, value, DateTools.dateToString(MAX_DATE, dRes), false, true);default:throw new UnsupportedSearchException();}
}

4.10 NumericRangeQuery

一个NumericRangeQuery ,它匹配指定范围内的数值。 要使用此功能,您必须首先为数字索引。我们可以将NumericRangeQueryTermQuery结合使用,

String termQueryString = "title:\\"hello world\\"";
Query termQuery = parser.parse(termQueryString);
Query pageQueryRange = NumericRangeQuery.newIntRange("page_count", 10, 20, true, true);
Query query = termQuery.combine(new Query[]{termQuery, pageQueryRange});

4.11 ConstantScoreQuery

包含另一个查询或过滤器的查询,对于与过滤器或查询匹配的每个文档,仅返回等于查询提升的常数分数。 因此,对于查询,它仅去除所有分数并返回一个常数。

{"constant_score" : {"filter" : {"term" : { "user" : "kimchy"}},"boost" : 1.2}
}

过滤器对象只能容纳过滤器元素,不能容纳查询。 过滤器比查询查询要快得多,因为它们不执行任何评分,尤其是在缓存时。查询还可以包装在constant_score查询中:

{"constant_score" : {"query" : {"term" : { "user" : "kimchy"}},"boost" : 1.2}
}

4.12 DisjunctionMaxQuery

一个查询,该查询生成由其子查询生成的文档并集,并用任何子查询生成的该文档的最高分数对每个文档评分,并为任何其他匹配的子查询加上平局打破增量。

在多个具有不同提升因子的字段中搜索单词时,这很有用(这样就无法将这些字段等效地组合到单个搜索字段中)。 我们希望主要分数是与最高提升相关的分数,而不是字段分数的总和(如布尔查询所给出的那样)。 如果查询是“白化大象”,则这确保匹配一个字段的“白化”和匹配另一个字段的“大象”获得比匹配两个字段的“白化”更高的分数。 要获得此结果,请同时使用Boolean Query和DisjunctionMaxQuery :对于每个术语,DisjunctionMaxQuery在每个字段中进行搜索,同时将这些DisjunctionMaxQuery的集合组合为BooleanQuery

打破平局能力使在多个字段中包含相同术语的结果比仅在多个字段中最好的包含该术语的结果更好地进行判断,而不会与多个字段中两个不同术语的更好情况相混淆。默认的tie_breaker是0.0。此查询映射到Lucene DisjunctionMaxQuery

{"dis_max" : {"tie_breaker" : 0.7,"boost" : 1.2,"queries" : [{"term" : { "age" : 34 }},{"term" : { "age" : 35 }}]}
}

4.13 MatchAllDocsQuery

与所有文档匹配的查询。 映射到Lucene MatchAllDocsQuery

{"match_all" : { }
}

哪些也可以与之关联:

{"match_all" : { "boost" : 1.2 }
}

翻译自: https://www.javacodegeeks.com/2015/09/integrating-lucene-search-into-an-application.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql运算结果放入表中_MySQL表1新增数据,计算开始、结束日期之间所有时间,插入到表2中...

新建表c3#id设置自增量&#xff0c;kk是要同步的一些数据值&#xff0c;dd是开始时间&#xff0c;dde是结束时间CREATE TABLE c3 (id int(11) NOT NULL auto_increment PRIMARY KEY,kk varchar(255),dd datetime,dde datetime)新建表c4#id也设置自增量&#xff0c;kk是要同步…

git-svn — 让git和svn协同工作

git-svn — 让git和svn协同工作svn作为一个优秀源码版本的管理工具&#xff0c;可以适合绝大多数项目。但是因为它的采用中心化管理&#xff0c;不可避免的存在本地代码的备份和版本管理问题。也就是说对于尚未或暂无法提交到Subversion服务器的本地代码来说&#xff0c;存在着…

longtext长度为0是什么意思_为什么 HashMap 中链表长度大于 8 才转化为红黑树?

Java 中的 HashMap 采用链表法来解决哈希冲突&#xff08;HashMap 原理&#xff09;&#xff0c;即具有相同桶下标的键值对使用一个链表储存。当链表变长时&#xff0c;查找和添加&#xff08;需要确定 key 是否已经存在&#xff09;都需要遍历这个链表&#xff0c;速度会变慢。…

Ulink2 No Ulink Device found 解决办法

一、背景keil使用ULINK2调试的时候&#xff0c;提示"No Ulink Device found"&#xff0c;"error: flash download failed - Target DLL has cancelled" 。之前一直都OK&#xff0c;然后今天突然不行&#xff0c;插上的时候&#xff0c;"COM",&qu…

python图形界面教程_图形教程

python图形界面教程众所周知&#xff0c;我们可以借助Java库制作游戏&#xff0c;这些库为我们提供制作游戏所需的图形。 因此&#xff0c;今天我将开始一个关于Java图形的非常新的部分。 我之前曾发表过有关如何制作所得税计算器的文章 。 首先要满足一些先决条件&#xff1a;…

java创建树结构_Java学习之XML-017

如果想快速有效的学习&#xff0c;思想核心是“以建立知识体系为核心”&#xff0c;具体方法是“守破离”。反复练习直到熟练。————百战程序员1.0 XML1.1 XML 简介XML 指可扩展标记语言。XML 被设计用来传输和存储数据。1. 什么是XMLXML 指可扩展标记语言&#xff08;EXten…

dll文件是什么

dll实际上是动态链接库的缩写&#xff0c;从windows1.0开始&#xff0c;动态链接库就是整个操作系统的基础&#xff0c;那么这有什么作用呢&#xff1f;在dos时代&#xff0c;程序员是通过编写程序来达到预期的目的的&#xff0c;每实现一个目的就需要编写一个程序&#xff0c;…

minecraft pythonapl_Substance PythonAPI入门案例

第一次在知乎发文&#xff0c;技术朋友们请多包涵。Substance Designer自去年夏天2018版推出Python API至今已有一年&#xff0c;从一开始的寒酸到现在的初成规模&#xff0c;官方的API库也随着版本的更新不断完善。目前网上(包括youtube)相关的教程甚少&#xff0c;即便是官方…

创建示例HTTPS服务器以获取乐趣和收益

通常&#xff0c;在开发人员或/和针对实际场景进行测试期间&#xff0c;我们&#xff08;开发人员&#xff09;面临着运行成熟的HTTPS服务器的需求&#xff0c;可能同时进行一些模拟。 在JVM平台上&#xff0c;除非您知道适合此工作的正确工具&#xff0c;否则它过去并不是一件…

WebDriver API元素的定位

一、以下截图为用FireBug定位的用火狐(Firefox)浏览器打开的百度首页&#xff0c;下面所讲述的八种定位方法&#xff0c;就是以该截图中的百度输入框为例子。 ①、FireBug是Firefox浏览器下的开发类插件&#xff0c;通过该插件可以查看HTML、CSS、Javascript控制台、网络状况监…

mysql字符乱码百度_如何解决MySQL字符集乱码问题

变量 a 的字符编码是由参数 CHARACTER_SET_CLIENT 决定的&#xff0c;假设此时编码为 A&#xff0c;也就是变量 a 的编码。2. 写入语句在发送到 MySQL 服务端之前的编码由 CHARACTER_SET_CONNECTION 决定&#xff0c;假设此时编码为 B。3. 经过 MySQL 一系列词法&#xff0c;语…

[水煮 ASP.NET Web API2 方法论](1-6)Model Validation

问题 想要 ASP.NET Web API 执行模型验证&#xff0c;同时可以和 ASP.NET MVC 共享一些验证逻辑。 解决方案 ASP.NET Web API 与 ASP.NET MVC 支持一样的验证机制&#xff0c;都是通过System.ComponentModel.DataAnnoataions 的属性验证。使用框架提供的相关验证属性&#xff0…

findbugs-dea_FindBugs和JSR-305

findbugs-dea假设该组开发人员在大型项目的各个部分上并行工作-一些开发人员在进行服务实现&#xff0c;而其他开发人员在使用该服务的代码。 考虑到API的假设&#xff0c;两个小组都同意服务API&#xff0c;并开始单独工作。 您认为这个故事会有幸福的结局吗&#xff1f; 好吧…

课程2 谈论音乐行业的趋势

1. 音乐词汇 CDdownloadLPsrecordsvinyl 黑胶sounddlbum covers 专辑封面2. 使用类似单词谈论各种录制你和聆听音乐的不同媒体 I still prefer the sound of my old LP records.My father used to by a lot of CDs.Most of my music these days is MP3s.3. 你可以使用这些词来谈…

带有ActiveMQ和Maven的JMS Sender应用程序

我们已经看到了如何使用ActiveMQ和Maven创建JMS Receiver应用程序 。 让我们看看我们如何类似地创建JMS Sender应用程序 。 web.xml与创建接收器应用程序时使用的相同&#xff1a; <web-app xmlns"http://java.sun.com/xml/ns/javaee"xmlns:xsi"http://www…

mysql自连接查询的sql语句_mysql 自连接

SELECT语句中的自连接。到目前为止&#xff0c;我们连接的都是两张不同的表&#xff0c;那么能不能对一张表进行自我连接呢&#xff1f;答案是肯定的。有没有必要对一张表进行自我连接呢&#xff1f;答案也是肯定的。表的别名&#xff1a;一张表可以自我连接。进行自连接时我们…

Spring的Lifecycle

Lifecycle接口定义了每个对象的重要方法&#xff0c;每个对象都有自己的生命周期需求&#xff0c;如下&#xff1a; public interface Lifecycle { void start(); void stop(); boolean isRunning(); } 任何spring管理的对象都可以实现这个接口。那么&#xff0c;当Appl…

mysql aes密钥大于16位_aes秘钥限制问题解决办法

在oarcle jdk1.8上执行256位的aes秘钥加密报错如下:java.lang.RuntimeException: java.security.InvalidKeyException: Illegal key sizeat com.xx.opal.core.utils.aes.AESTool.encryptWithoutEncode(AESTool.java:33)at com.xx.opal.aes.AESTest.test(AESTest.java:19)at sun…

background-clip与background-origin

规定背景的绘制区域 浏览器支持 IE9、Firefox、Opera、Chrome 以及 Safari 支持 background-clip 属性。 注释&#xff1a;Internet Explorer 8 以及更早的版本不支持 background-clip 属性。IE9、Firefox、Opera、Chrome 以及 Safari 支持 background-clip 属性。 有三个值&am…

策略模式应用场景和uml_策略模式

策略模式应用场景和uml在最近的博客中&#xff0c;我收到了Wojciech Soczy&#xff1f;ski的评论&#xff0c;内容涉及在使用“不要问”&#xff08;TDA&#xff09;时如何使用“战略”模式实施单一责任原则&#xff08;SRP&#xff09;。 在某些时候&#xff0c;我打算进一步讨…