0

我无法让 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 匹配其中任何一个。

4

2 回答 2

2

正如大卫在他的回答中告诉你的那样,我们分析了一些弹性搜索查询。通常您不想将 ngram 应用于您的查询,但您似乎已经知道给定您的映射。实际上,没有考虑到没有 ngrams 的搜索分析器的原因是一个错字:search_anaylzer而不是search_analyzer. 这就是为什么您的查询变为blandblv并且bl与返回的文档匹配的原因。

于 2012-10-16T11:00:27.623 回答
1

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

您可以使用未分析的 TermQuery。

很难说更多,因为我没有您的查询。

大卫

于 2012-10-16T09:31:09.830 回答