Elasticsearch 多字段查找 (三)ITeye - AG环亚娱乐集团

Elasticsearch 多字段查找 (三)ITeye

2019-01-12 00:48:23 | 作者: 千风 | 标签: 字段,文档,查找 | 浏览: 2518

进步单个字段

单个字段能够经过caret语法(^)进行进步:仅需求在字段名后添加^boost,其间的boost是一个浮点数:

{
 "multi_match": {
 "query": "Quick brown fox",
 "fields": [ "*_title", "chapter_title^2" ] 
}

chapter_title字段的boost值为2,而book_title和section_title字段的boost值为默许的1。


 

 

大都字段(Most Fields)

 

全文查找是一场召回率(Recall) - 回来一切相关的文档,以及准确率(Precision) - 不回来无关文档,之间的战役。方针是在成果的榜首页给用户出现最相关的文档。

为了进步召回率,咱们会广撒网 - 不只包括准确匹配了用户查找词条的文档,还包括了那些咱们以为和查询相关的文档。假如一个用户查找了"quick brown fox",一份含有fast foxes的文档也能够作为一个合理的回来成果。

假如咱们具有的相关文档仅仅是含有fast foxes的文档,那么它会出现在成果列表的顶部。可是假如咱们有100份含有quick brown fox的文档,那么含有fast foxes的文档的相关性就会变低,咱们期望它出现在成果列表的后边。在包括了许多或许的匹配后,咱们需求保证相关度高的文档出现在顶部。

一个用来调优全文查找相关性的常用技能是将相同的文本以多种方法索引,每一种索引方法都供给了不同相关度的信号(Signal)。首要字段(Main field)中含有的词条的方式是最广泛的(Broadest-matching),用来尽或许多的匹配文档。比方,咱们能够这样做:

运用一个词干提取器来将jumps,jumping和jumped索引成它们的词根:jump。然后当用户查找的是jumped时,咱们依然能够匹配含有jumping的文档。 包括近义词,比方jump,leap和hop。 移除变音符号或许腔调符号:比方,ésta,está和esta都会以esta被索引。

可是,假如咱们有两份文档,其间之一含有jumped,而另一份含有jumping,那么用户会期望榜首份文档的排序会靠前,因为它含有用户输入的准确值。

咱们能够经过将相同的文本索引到其它字段来供给愈加准确的匹配。一个字段能够包括未被提取词干的版别,另一个则是含有变音符号的原始单词,然后第三个运用了shingles,用来供给和单词附近度相关的信息。这些其它字段扮演的人物便是信号(Signals),它们用来添加每个匹配文档的相关度分值。能够匹配的字段越多,相关度就越高。

假如一份文档能够匹配具有最广泛方式的首要字段(Main field),那么它就会被包括到成果列表中。假如它一起也匹配了信号字段,它会得到一些额定的分值用来将它移动到成果列表的前面。

咱们会在本书的后边评论近义词,单词附近度,部分匹配以及其他或许的信号,可是咱们会运用提取了词干和未提取词干的字段的简略例子来解说这个技能。

多字段映射(Multifield Mapping)

榜首件事便是将咱们的字段索引两次:一次是提取了词干的方式,一次是未提取词干的方式。为了完成它,咱们会运用多字段(Multifields),在字符串排序和多字段中咱们介绍过:

DELETE /my_index
PUT /my_index
 "settings": { "number_of_shards": 1 }, 
 "mappings": {
 "my_type": {
 "properties": {
 "title": { 
 "type": "string",
 "analyzer": "english",
 "fields": {
 "std": { 
 "type": "string",
 "analyzer": "standard"
}

title字段运用了english解析器进行词干提取。 title.std字段则运用的是standard解析器,因而它没有进行词干提取。

下一步,咱们会索引一些文档:

PUT /my_index/my_type/1
{ "title": "My rabbit jumps" }
PUT /my_index/my_type/2
{ "title": "Jumping jack rabbits" }

以下是一个简略的针对title字段的match查询,它查询jumping rabbits:

GET /my_index/_search
 "query": {
 "match": {
 "title": "jumping rabbits"
}

它会变成一个针对两个提干后的词条jump和rabbit的查询,这要得益于english解析器。两份文档的title字段都包括了以上两个词条,因而两份文档的分值是相同的:

{
 "hits": [
 "_id": "1",
 "_score": 0.42039964,
 "_source": {
 "title": "My rabbit jumps"
 "_id": "2",
 "_score": 0.42039964,
 "_source": {
 "title": "Jumping jack rabbits"
}

假如咱们只查询title.std字段,那么只要文档2会匹配。可是,当咱们查询两个字段并将它们的分值经过bool查询进行兼并的话,两份文档都能够匹配(title字段也匹配了),而文档2的分值会更高一些(匹配了title.std字段):

GET /my_index/_search
 "query": {
 "multi_match": {
 "query": "jumping rabbits",
 "type": "most_fields", 
 "fields": [ "title", "title.std" ]
}

在上述查询中,因为咱们想兼并一切匹配字段的分值,因而运用的类型为most_fields。这会让multi_match查询将针对两个字段的查询子句包括在一个bool查询中,而不是包括在一个dis_max查询中。

{
 "hits": [
 "_id": "2",
 "_score": 0.8226396, 
 "_source": {
 "title": "Jumping jack rabbits"
 "_id": "1",
 "_score": 0.10741998, 
 "_source": {
 "title": "My rabbit jumps"
}

此刻,文档2的分值比文档1的高许多。

咱们运用了具有广泛方式的title字段来匹配尽或许多的文档 - 来添加召回率(Recall),一起也运用了title.std字段作为信号来让最相关的文档能够具有更靠前的排序(译注:添加了准确率(Precision))。

每个字段对终究分值的奉献能够经过指定boost值进行操控。比方,咱们能够进步title字段来让该字段愈加重要,这也减小了其它信号字段的影响:

GET /my_index/_search
 "query": {
 "multi_match": {
 "query": "jumping rabbits",
 "type": "most_fields",
 "fields": [ "title^10", "title.std" ] 
}
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    ClassLoaderITeye

    运用,文件,办法
  • 2
  • 3
  • 4

    手机号码校验合法性ITeye

    代表,必定,第二位
  • 5
  • 6

    Java 目标巨细的核算ITeye

    目标,巨细,字节
  • 7
  • 8
  • 9

    架构师之jdk8ITeye

    字符串,判别,如果
  • 10