突出与模糊和ngram

时间:2015-11-18 21:12:33

标签: elasticsearch

我猜这个主题的标题足以让你感到厌烦:D

我使用edge_ngram并突出显示以构建自动完成搜索。我在查询中添加了模糊性以允许用户拼错他们的搜索,但它突出了一点。

当我写Sport时,这就是我得到的:

<em>Spor</em>t
<em>Spor</em>t mécanique
<em>Spor</em>t nautique

我想这是因为它与ngram tokenizer生成的令牌spor匹配。

查询:

{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "name": {
                            "query": "sport",
                            "operator": "and",
                            "fuzziness": "AUTO"
                        }
                    }
                },
                {
                    "match_phrase_prefix": {
                        "name.raw": {
                            "query": "sport"
                        }
                    }
                }
            ]
        }   
    },
    "highlight": {
        "fields": {
            "name": {
              "term_vector": "with_positions_offsets"
            }
        }
    }
}

映射:

{
    "settings": {
        "analysis": {
            "analyzer": {
                "partialAnalyzer": {
                    "type": "custom",
                    "tokenizer": "ngram_tokenizer",
                    "filter": ["asciifolding", "lowercase"]
                },
                "keywordAnalyzer": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": ["asciifolding", "lowercase"]
                },
                "searchAnalyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["asciifolding", "lowercase"]
                }
            },

            "tokenizer": {
                "ngram_tokenizer": {
                    "type": "edge_ngram",
                    "min_gram": "1",
                    "max_gram": "15",
                    "token_chars": [ "letter", "digit" ]
                }
            }
        }
    },

    "mappings": {
        "place": {
            "properties": {
                "name": {
                    "type": "string",
                    "index_analyzer": "partialAnalyzer",
                    "search_analyzer": "searchAnalyzer",
                    "term_vector": "with_positions_offsets",
                    "fields": {
                        "raw": {
                            "type": "string",
                            "analyzer": "keywordAnalyzer"
                        }
                    }
                }
            }
        }
    }
}

我尝试在查询中添加一个没有模糊性的新匹配子句,尝试将匹配前的关键字与模糊匹配,但它没有改变任何内容。

'match': {
   'name': {
   'query': 'sport',
   'operator': 'and'
}

知道如何处理这件事吗?

问候,Raphaël

1 个答案:

答案 0 :(得分:2)

您可以使用highlight_query我想

在突出显示的查询中尝试此操作。

"highlight": {
    "fields": {
      "name": {
        "term_vector": "with_positions_offsets",
        "highlight_query": {
          "match": {
            "name.raw": {
                "query": "spotr",
                "fuzziness": 2
            }
          }
        }
      }
    }
  }

我希望它有所帮助。