在弹性搜索中搜索句子的部分单词

时间:2017-02-08 09:28:21

标签: c# elasticsearch

我是Elastic Search的新手,我想根据句子的部分单词搜索结果,比如搜索字符串是

  

" VAL"

它应该用字符串值

搜索结果
  

"价值大于100"

但如果我使用的是查询

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

                );

它只适用于像

这样的单词字符串
  

&#34; ValueIsGraterThan100&#34;

如果我使用这样的东西

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

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

                );

这适用于整个单词,就像我必须提供搜索字符串

一样
  

&#34;值&#34;

搜索

  

&#34;价值大于100&#34;

仅提供val将无效。那么我如何才能满足我的要求?

1 个答案:

答案 0 :(得分:1)

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

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或term filter来将您的文档与val匹配

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

希望这有帮助