elasticsearch,lucene,full-text-search,Search,elasticsearch,Lucene,Full Text Search" /> elasticsearch,lucene,full-text-search,Search,elasticsearch,Lucene,Full Text Search" />

Elasticsearch查询字符串与匹配短语组合

Elasticsearch查询字符串与匹配短语组合,search,elasticsearch,lucene,full-text-search,Search,elasticsearch,Lucene,Full Text Search,我认为最好是描述我的意图,并尝试将其分解为代码 我希望用户能够在选择query\u字符串时进行复杂查询。例如“AND”和“OR”和“~”等 我想让模糊性生效,这让我做了一些让我感到肮脏的事情,比如“#{query}~”发送到ES,换句话说,我代表用户指定模糊查询,因为我们提供的音译可能很难获得准确的拼写 有时,用户搜索一个短语中的许多单词查询字符串单独搜索,而不是作为短语搜索。例如,当这三个词按顺序排列时,“他将”应该给我带来最热门的比赛,然后再给我任何东西 当前查询: { "indices

我认为最好是描述我的意图,并尝试将其分解为代码

  • 我希望用户能够在选择
    query\u字符串时进行复杂查询。例如“AND”和“OR”和“~”等
  • 我想让模糊性生效,这让我做了一些让我感到肮脏的事情,比如“#{query}~”发送到ES,换句话说,我代表用户指定模糊查询,因为我们提供的音译可能很难获得准确的拼写
  • 有时,用户搜索一个短语中的许多单词<代码>查询字符串单独搜索,而不是作为短语搜索。例如,当这三个词按顺序排列时,“他将”应该给我带来最热门的比赛,然后再给我任何东西
  • 当前查询:

    {
      "indices_boost": {},
      "aggregations": {
        "by_ayah_key": {
          "terms": {
            "field": "ayah.ayah_key",
            "size": 6236,
            "order": {
              "average_score": "desc"
            }
          },
          "aggregations": {
            "match": {
              "top_hits": {
                "highlight": {
                  "fields": {
                    "text": {
                      "type": "fvh",
                      "matched_fields": [
                        "text.root",
                        "text.stem_clean",
                        "text.lemma_clean",
                        "text.stemmed",
                        "text"
                      ],
                      "number_of_fragments": 0
                    }
                  },
                  "tags_schema": "styled"
                },
                "sort": [
                  {
                    "_score": {
                      "order": "desc"
                    }
                  }
                ],
                "_source": {
                  "include": [
                    "text",
                    "resource.*",
                    "language.*"
                  ]
                },
                "size": 5
              }
            },
            "average_score": {
              "avg": {
                "script": "_score"
              }
            }
          }
        }
      },
      "from": 0,
      "size": 0,
      "_source": [
        "text",
        "resource.*",
        "language.*"
      ],
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "query": "inna alatheena",
                "fuzziness": 1,
                "fields": [
                  "text^1.6",
                  "text.stemmed"
                ],
                "minimum_should_match": "85%"
              }
            }
          ],
          "should": [
              {
                "match": {
                    "text": {
                        "query": "inna alatheena",
                        "type": "phrase"
                    }
                }
            }
            ]
        }
      }
    }
    
    注意:
    alatheena
    在没有
    ~
    的情况下搜索不会返回任何内容,尽管我在索引中有
    alatheena
    。所以我必须做一个模糊搜索

    有什么想法吗?

    你应该用它来实现

    一种查询,用于生成由其 子查询,并为每个文档的 由任何子查询生成的文档,加上一个中断连接 任何其他匹配子查询的增量

    这在使用搜索多个字段中的单词时非常有用 不同的增压系数(因此不能组合磁场 等效为单个搜索字段)。我们想让初选的分数 是与最高增压相关联的

    如何使用它的快速示例:

    POST /_search
    {
      "query": {
        "dis_max": {
          "tie_breaker": 0.7,
          "boost": 1.2,
          "queries": [
            {
              "match": {
                "text": {
                  "query": "inna alatheena",
                  "type": "phrase",
                  "boost": 5
                }
              }
            },
            {
              "match": {
                "text": {
                  "query": "inna alatheena",
                  "type": "phrase",
                  "fuzziness": "AUTO",
                  "boost": 3
                }
              }
            },
            {
              "query_string": {
                "default_field": "text",
                "query": "inna alatheena"
              }
            }
          ]
        }
      }
    }
    

    它将运行您的所有查询,并且将采用与其他查询相比得分最高的查询。因此,只需使用它定义您的规则。你应该实现你想要的。

    我看到你在做古兰经经文的索引,+1

    如果我理解正确的话,您的许多问题域都可以通过在Aayah文档的一个单独字段中存储大量的音译变体(及其组合的排列)来解决

    首先,您应该制作一个字符过滤器,将所有双字母替换为单字母
    [aa]=>[a]
    [ll]=>[l]

    也可以将包含所有
    [a,e,i]
    的单独字段(因为它们的“呼应性”//transcribal歧义性)替换为
    或类似内容,并在查询时执行相同操作,以获得尽可能多的匹配项

    此外,“Allateena”中的TH(作为脚注,可能真的是Dhaal、Thaa、Zhaa、Taa+Haa、Taa+Hhaa、Ttaa+Hhaa转录…)应该被某个东西取代,或者Dhaal和Thaa都应该被转录多次

    然后,因为它是古兰经的脚本,所有不带变音符号的Alef、Hamza、Madda等都应该被视为Alef(或Hamzat)ul-Wasl,在索引/搜索时也应该考虑到这一点,因为阿拉伯语中的Waqf/Wasl。(以苏拉特阿拉克省第一个阿雅省的所有Wasl为例)


    不知道这是否以任何方式回答了您的问题,但我希望这对实现您的应用程序有帮助。

    这太棒了!今晚我想试试这个,让你知道效果如何。还有一个问题,match_短语查询不支持模糊性,我如何才能使其实现?例如,它不会返回任何带有“inna alatheena”的内容,因为它实际上是“inna allatheena”@MohamedElMahallawy,你是对的。模糊查询不适用于短语查询。我所能想到的就是使用char_过滤器将ll规范化为l。或者更好,使用启用功能。不知道这算不算自我提升(但这是一个利基领域,谁在乎呢),以下是我在同一个问题领域所做的一些工作: