2017-02-08 117 views
0

我是很新的弹性的搜索,我要根据句子的部分字词搜索结果,像搜索字符串是搜索到一个句子的部分词在弹性搜索

“VAL”

,它应该与搜索字符串值

结果 “值刨丝器超过100个”

,但如果我使用的查询

var searchDescriptor = new SearchDescriptor<ElasticsearchProject>() 
searchDescriptor.Query(q => 
        q.Wildcard(m => m.OnField(p => p.PNumber).Value(string.Format("*{0}*", searchString))) 

       ); 

它只会工作一个单词串像

“ValueIsGraterThan100”

如果我用这样的

var searchDescriptor = new SearchDescriptor<ElasticsearchProject>() 
searchDescriptor.Query(q => 

        q.QueryString(m => m.OnFields(p => p.PName).Query(searchString)) 

       ); 

This will wor K代表整个字,如我必须提供搜索字符串作为

“值”

搜索

“值是磨碎器超过100”

只提供val将无法​​正常工作。所以我如何满足我的要求?

+0

请提供您的映射和字段名,在那里你搜索 – Mysterion

+0

哟可以把它当作,有一个表名'permit',我正在搜索一个提交的名字'PermitDescription'。所以许可说明是在这里的领域。 – Viplock

+0

是?我需要一个映射,因为这对于你的索引如何配置至关重要。 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html – Mysterion

回答

1

您的字段目前没有分析,您可以使用edge n-gram由边缘ngram过滤器组成的分析器来标记您的字段,然后将字段保存在倒排索引上。您可以使用以下设置

PUT index_name1323 
{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "autocomplete_analyzer": { 
        "type": "custom", 
        "tokenizer": "standard", 
        "filter": [ 
         "standard", 
         "lowercase", 
         "filter_edgengram" 
        ] 
       } 
      }, 
      "filter": { 
       "filter_edgengram": { 
        "type": "edgeNGram", 
        "min_gram": 2, 
        "max_gram": 15 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "test_type": { 
      "properties": { 
       "props": { 
        "type": "string", 
        "analyzer": "autocomplete_analyzer" 
       } 
      } 
     } 
    } 
} 

现在,你可以简单地使用这两种QUERY_STRING或长期过滤到这两个文件匹配VAL

POST index_name1323/_search 
{ 
    "query": { 
     "query_string": { 
      "default_field": "props", 
      "query": "val" 
     } 
    } 
} 

希望这有助于

+0

我用'FieldIndexOption.Analyzed'在'PutMappingDescriptor'中添加了一个映射,并创建了一个通配符过滤器查询。它为我工作。顺便谢谢你的回答。 – Viplock

+0

是分析字段上的通配符也可以在不使用edge-n gram标记器的情况下工作,我只是首选此分析器作为性能查询的通配符是纯字符串挖掘高IO操作。谢谢 – user3775217