2012-10-16 87 views
0

我无法使edgengram查询正常工作。我有一个记录“blue grass”,edgengram最小值为2.查询字符串“blv”然而返回“蓝色草地”,尽管它不应该。在edgeNGram中找不到返回结果的查询字符串

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,并将“blue grass”分解为“bl”,“blu”,“blue”,“gr”,“gra”,“gras”,“grass”,但“blv” t匹配任何这些。

回答

2

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

+0

哦,我的,多么尴尬。就是这样,非常感谢...... /脸红 – axsuul

1

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

您可以使用未分析的TermQuery。

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

David

+0

谢谢,不知道! – axsuul

相关问题