• Elasticsearch


    我们经常会遇到问题。为什么指定的文档没有被搜索到。许多情况下, 这都归因于映射的定义和分析例程配置存在问题。

    针对分析过程的调试,ElasticSearch提供了专用的REST API。

    _analyze, _explain是Elasticsearch提供的辅助API。经常不为人所知和所用。

    _explain 用来帮助分析文档的relevance score是怎样计算出来的,而_analyze是Elasticsearch一个很实用的API,它能够帮助你分析每个field或者某个analyzer/tokenizer是怎样分析和索引一段文字。


    一、_analyze

    比如, 以下样例用test索引默认analyzer来分析 "xi fei jian"

    GET /test/_analyze?

    text="xi fei jian"

    运行结果:

    {
       "tokens": [
          {
             "token": "xi",
             "start_offset": 1,
             "end_offset": 3,
             "type": "<ALPHANUM>",
             "position": 1
          },
          {
             "token": "fei",
             "start_offset": 4,
             "end_offset": 7,
             "type": "<ALPHANUM>",
             "position": 2
          },
          {
             "token": "jian",
             "start_offset": 8,
             "end_offset": 12,
             "type": "<ALPHANUM>",
             "position": 3
          }
       ]
    }


    当然。你也能够用指定的analyzer来分析。比如:GET /test/_analyze?analyzer=whitespace&text=xi fei jian。这里的analyzer能够是系统默认分析器,也能够是自己定义分析器。

    此外, 你还能够使用指定field的analyzer来分析。比如:GET/test/_analyze?field=typename.fieldname&text=xi fei jian


    还有还有一种能够设置分词器(tokenizer)和过滤器的分析API,在我们试图创建目标映射之前进行配置时就会很方便。

    比如:

    curl -XGET ‘localhost:9200/addressbook/_analyze?tokenizer=whitespace&filters=lowcase,engram&pretty' -d 'John Smith'

    能够看到,在跟踪映射配置中的BUG时,分析API是比較实用的。它能够告诉我们分析器怎样工作、会产生哪些词项,以及这些词项的属性。有了这些信息,分析、解决查询问题时会更easy追查原因。


    二、_explain

    以上是对查询和分析过程进行说明,对于解释查询部分(好像和mysql挺像的哇~~),我们能够使用_explain向ElasticSearch询问庆于该文档是怎样匹配(或者没有匹配上)的解释信息。比如,该文档是否能在给定的查询中被检索到?假设找到了,ElasticSearch将返回分值计算的具体悠 ,以解释为什么该文档会匹配成功。

    GET /us/tweet/12/_explain?pretty&q=honeymoon,能够得到例如以下结果:

    "_explanation": { 
       "description": "weight(tweet:honeymoon in 0)
                      [PerFieldSimilarity], result of:",
       "value":       0.076713204,
       "details": [
          {
             "description": "fieldWeight in 0, product of:",
             "value":       0.076713204,
             "details": [
                {  
                   "description": "tf(freq=1.0), with freq of:",
                   "value":       1,
                   "details": [
                      {
                         "description": "termFreq=1.0",
                         "value":       1
                      }
                   ]
                },
                { 
                   "description": "idf(docFreq=1, maxDocs=1)",
                   "value":       0.30685282
                },
                { 
                   "description": "fieldNorm(doc=0)",
                   "value":        0.25,
                }
             ]
          }
       ]
    }

    看起来有点复杂。这里最重要的内容就是对文档计算得到的总分,假设总分等于0。则该文档将不能匹配给定的查询。还有一个重要内容是关于不同打分项的描写叙述信息。

    根据查询类型的不同,打分项会以不同方式对最后得分产生影响。

    从上面termFreq=1表明检索的词项在该字段下仅仅出现了一次。maxDocs=1,说明根据指定的检索词项仅仅找到了一个文档。


    官方文档:https://www.elastic.co/guide/en/elasticsearch/guide/2.x/relevance-intro.html#explain-api



  • 相关阅读:
    git的相关命令
    vue资料链接
    自定义小程序底部菜单
    物联网开发日记四:原理图2
    物联网开发日记三:原理图1
    物联网开发日记二:设计系统结构
    物联网开发日记一:准备工作
    mybatis不使用@Param有人报错有人却不报错问题
    最简单的js包装对象、ajax请求
    java文字转拼音、首字母缩写
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7358998.html
Copyright © 2020-2023  润新知