我想将Elasticsearch用于多词搜索,其中所有字段都使用指定的分析器在文档中进行检查。

因此,如果我有一个映射:

{
"settings": {
    "analysis": {
      "analyzer": {
        "folding": {
          "tokenizer": "standard",
          "filter":  [ "lowercase", "asciifolding" ]
        }
      }
    }
  },
  "mappings" : {
    "typeName" :{
      "date_detection": false,
      "properties" : {
        "stringfield" : {
          "type" : "string",
          "index" : "folding"
        },
        "numberfield" : {
          "type" : "multi_field",
          "fields" : {
            "numberfield" : {"type" : "double"},
            "untouched" : {"type" : "string", "index" : "not_analyzed"}
          }
        },
        "datefield" : {
          "type" : "multi_field",
          "fields" : {
            "datefield" : {"type" : "date", "format": "dd/MM/yyyy||yyyy-MM-dd"},
            "untouched" : {"type" : "string", "index" : "not_analyzed"}
          }
        }
      }
    }
  }
}

如您所见,我有不同类型的字段,但是我知道结构。
我想做的是使用字符串开始搜索,以使用分析器检查所有字段。

例如,如果查询字符串是:
John Smith 2014-10-02 300.00

我想在所有字段中搜索“约翰”,“史密斯”,“2014-10-02”和“300.00”,并计算相关性得分。更好的解决方案是在单个文档中具有更多字段匹配项的解决方案。

到目前为止,我可以使用multi_field在所有字段中进行搜索,但是在那种情况下,由于300被存储在multi_field的字符串部分中,因此我无法解析300.00。
如果我在“_all”字段中搜索,则不使用分析器。

我应该如何修改映射或查询以进行多字搜索,从而在多字查询字符串中识别出日期和数字?
现在,当我执行搜索时,由于无法将整个字符串解析为数字或日期,因此会发生错误。如果我使用multi_search的字符串表示形式,那么由于字符串表示形式为300,因此不会是300.00的结果。

(我想要的类似于Google搜索,在多字查询中可以识别日期,数字和字符串)

有任何想法吗?

谢谢!

最佳答案

使用whitespace作为analyzer中的过滤器,然后将此analyzer作为search_analyzer应用于mapping中的字段,将查询分成多个部分,并将每个查询应用于索引以找到最佳匹配。并且将ngram用作index_analyzer将大大改善结果。
我正在使用以下设置进行查询:

"query": {
            "multi_match": {
                "query": "sample query",
                "fuzziness": "AUTO",
                "fields": [
                    "title",
                    "subtitle",
                ]
            }
        }

对于映射和设置:
{
"settings" : {
    "analysis": {
        "analyzer": {
            "autocomplete": {
                "type": "custom",
                "tokenizer": "whitespace",
                "filter": [
                    "standard",
                    "lowercase",
                    "ngram"
                ]
            }
        },
        "filter": {
            "ngram": {
                "type": "ngram",
                "min_gram": 2,
                "max_gram": 15
            }
        }
    },
"mappings": {
        "title": {
            "type": "string",
            "search_analyzer": "whitespace",
            "index_analyzer": "autocomplete"
        },
        "subtitle": {
            "type": "string"
        }
    }
}

有关更多详细信息,请参见以下answerarticle

关于elasticsearch - 使用分析器的Elasticsearch多字,多字段搜索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26157342/

10-17 00:00