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

问题描述 投票:0回答:1

要求是搜索文本块中的部分短语。大多数单词都是标准长度。我想将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。

elasticsearch search elasticsearch-5 n-gram
1个回答
0
投票

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

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

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

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

{
...
  "mappings": {
    "doc": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        }
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.