我的映射如下所示。如您所见,名称字段已被分析

     {
       "state":"open",
       "settings":{
          "index":{
             "creation_date":"1453816191454",
             "number_of_shards":"5",
             "number_of_replicas":"1",
             "version":{
                "created":"1070199"
             },
          }
       },
       "mappings":{
          "Product":{
             "properties":{
                "index":"not_analyzed",
                "store":true,
                "type":"string"
             },
            "Name":{
                "store":true,
                "type":"string"
             },
             "Number":{
                "index":"not_analyzed",
                "store":true,
                "type":"string"
             },
             "id":{
                "index":"no",
                "store":true,
                "type":"integer"
   }
         }
      },
      "aliases":[

      ]
   }
}

当我如下查询
   "query": {
            "match_phrase": {
               "Name": "hl-2240"
            }
         }

这很好用,“hl 2240”也可以,但是当我键入“hl2240”时。我没有任何结果。我知道这是因为名称被索引为“hl-2240”,并且我猜我使用的是标准输入或通用分析器,它的符号化为hl和2240。虽然我没有任何符号hl2240的反向索引,但找不到任何东西。我了解到我应该使用另一个分析仪。但这就是我所坚持的。我可以使用哪个分析仪?我应该重新索引我的索引还是只能使用分析器查询?如果我更改分析仪以对数据建立索引,则要确保我不会丢失搜索“hl-2240”或“hl 2240”的结果。

更新:我试图为Richa的答案嵌套查询。
   Client.CreateIndex("myIndex",
            ci => ci.Analysis(a => a.TokenFilters(f => f.Add("my_word_delimiter", new WordDelimiterTokenFilter
            {
              CatenateAll = true

            }))
            .Analyzers(an => an.Add("my_analyzer", new CustomAnalyzer
            {
              Tokenizer = "whitespace",
              Filter = new List<string> {"standard",
              "lowercase",
              "my_word_delimiter"}
            }))));

最佳答案

尝试使用此analyzer:

{
 "settings": {
  "analysis": {
       "filter": {
        "my_word_delimiter": {
           "type": "word_delimiter",
           "catenate_all": true     <=== Notice this

        }
     },
     "analyzer": {
        "my_analyzer": {
           "type": "custom",
           "tokenizer": "whitespace",
           "filter": [
              "standard",
              "lowercase",
              "my_word_delimiter"
           ]
        }
     }

    }
  }
}

了解有关catenate_all的信息。

使用以下命令查看如何对字符串进行标记:
 curl -XGET "localhost:9200/index_8/_analyze?analyzer=my_analyzer&pretty=true" -d 'hl-2240'

这将产生以下输出,并且hl-2240将被索引为
{
"tokens" : [ {
 "token" : "hl",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 0
}, {
"token" : "hl2240",
"start_offset" : 0,
"end_offset" : 7,
"type" : "word",
"position" : 0
}, {
"token" : "2240",
"start_offset" : 3,
"end_offset" : 7,
"type" : "word",
"position" : 1
 }  ]
}

希望对您有帮助

10-08 16:37