当术语超过ngram长度时,Elasticsearch查询返回false结果

时间:2017-12-18 17:10:03

标签: elasticsearch search elasticsearch-5 n-gram

要求是搜索文本块中的部分短语。大多数单词都是标准长度。我想将max_gram值保持为10.但偶尔的id /代码可能会包含更多的字符,如果我输入前10个字符匹配的查询,则会显示这些,但其余的不会

例如,这是映射:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "autocomplete": {
          "tokenizer": "autocomplete",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "autocomplete": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 10,
          "token_chars": [
            "letter"
          ]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "autocomplete"
        }
      }
    }
  }
}

和文件:

POST my_index/doc/1
{
  "title": "Quick fox with id of ABCDEFGHIJKLMNOP" 
}

如果我运行查询:

POST my_index/doc/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "fox wi"
      }
    }
  }
}

按预期返回文档。但是,如果我运行这个:

POST my_index/doc/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "ABCDEFGHIJxxx"
      }
    }
  }
}

它还会返回文档。如果x在第10个字符之后但不在它之前,它将执行此操作。我怎么能避免这个?

我正在使用第5版。

1 个答案:

答案 0 :(得分:0)

默认情况下,在索引时使用的分析器与搜索时使用的分析器相同,这意味着edge_ngram分析器将用于您的搜索词。这不是你想要的。最终会有10个令牌作为搜索词,其中没有一个包含最后3个字符。

您需要查看映射的Search Analyzer。本文档指出了这个特定的用例:

  

但有时,在搜索时使用不同的分析器是有意义的,例如在使用edge_ngram标记生成器进行自动完成时。

标准分析仪可能符合您的需求:

{
...
  "mappings": {
    "doc": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        }
      }
    }
  }
}
相关问题