查询字符串返回结果在edgeNGram中找不到

时间:2012-10-16 07:47:00

标签: elasticsearch

我无法让edgengram查询正常运行。我有一个记录“蓝草”,其中edgengram最小为2.查询字符串“blv”然而返回“蓝草”,但它不应该。

curl -X POST http://localhost:9200/test -d '{ 
    "mappings": { 
        "product/fragrance": { 
            "properties": { 
                "name_query": { 
                    "index_analyzer": "query_index_analyzer", 
                    "search_anaylzer": "query_search_analyzer", 
                    "as": {}, 
                    "type": "string" 
                } 
            } 
        } 
    }, 
    "settings": { 
        "analysis": { 
            "filter": { 
                "query_edgengram": { 
                    "type": "edgeNGram", 
                    "min_gram": 2, 
                    "max_gram": 20, 
                    "side": "front" 
                } 
            }, 
            "analyzer": { 
                "query_index_analyzer": { 
                    "tokenizer": "lowercase", 
                    "filter": ["asciifolding", "query_edgengram"] 
                }, 
                "query_search_analyzer": { 
                    "tokenizer": "lowercase", 
                    "filter": ["asciifolding"] 
                } 
            } 
        } 
    } 
}' 

curl -X POST "http://localhost:9200/test/product%2Ffragrance/1" -d '{ 
    "name_query": "blue grass" 
}' 

curl -X GET "http://localhost:9200/test/product%2Ffragrance/_search?load=true&pretty=true" -d '{ 
    "query": { 
        "bool": { 
            "must": [{ 
                "query_string": { 
                    "query": "blv", 
                    "fields": ["name_query"], 
                    "default_operator": "OR" 
                } 
            }] 
        } 
    } 
}' 

出于某种原因,我得到了一个结果。有谁能解释为什么?谢谢。我想要发生的是“blv”不应该返回“蓝草”,尽管“bl”应该。我已经使用了分析API,看到“蓝草”被分解为“bl”,“blu”,“blue”,“gr”,“gra”,“gras”,“grass”但是“blv”没有t匹配其中任何一个。

2 个答案:

答案 0 :(得分:2)

正如大卫在他的回答中告诉你的那样,分析了一些弹性搜索查询。通常您不希望将ngrams应用于您的查询,但您似乎已经知道给定您的映射。事实上,没有考虑没有ngrams的搜索分析器的原因是错误:search_anaylzer而不是search_analyzer。这就是您的查询变为blblvbl与返回的文档匹配的原因。

答案 1 :(得分:1)

使用MatchQuery或QueryString搜索某些内容时,会应用相同的分析器。 所以blv被标记为bl,blv和bl匹配bl!

您可以使用未分析的TermQuery。

很难说更多,因为我没有你的疑问。

大卫