Elasticsearch query_string与match_phrase

时间:2015-11-07 08:18:46

标签: search elasticsearch lucene full-text-search

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

  1. 我希望用户能够选择query_string提供的复杂查询。例如'AND'和'OR'和'〜'等。
  2. 我想要有模糊效果,这让我做了一些我觉得很脏的事情,就像发送到ES的“#{query}〜”,换句话说,我代表用户指定模糊查询,因为我们提供音译可能难以准确拼写。
  3. 有时,用户会搜索一些假设在短语中的单词。 query_string单独搜索它们而不是短语。例如,“谁将会”应该为我带来最高级别的比赛,当这三个单词按顺序排列时,请稍后再给我。
  4. 当前查询:

    {
      "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在没有~的情况下进行搜索,虽然索引中有allatheena,但不会返回任何内容。所以我必须进行模糊搜索。

    有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您应该使用Dis Max Query来实现这一目标。

  

生成由其生成的文档的并集的查询   子查询,并为每个文档评分最高分数   该文档由任何子查询生成,加上打破平局   任何其他匹配子查询的增量。

     

这在使用多个字段搜索单词时非常有用   不同的提升因子(因此不能组合字段   等效地进入单个搜索字段)。我们希望得分为   是与最高提升相关联的人。

快速举例说明如何使用它:

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 :(得分:1)

我看到你正在对Qur' anic经文进行ES索引, +1 ......

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

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

也许还会创建一个单独的字段,其中包含所有[a, e, i](由于他们的"声音" / transcribal歧义)替换为或类似的东西,并在查询时执行相同的操作为了获得尽可能多的比赛......

此外,TH" allatheena" (作为脚注可能真的是Dhaal,Thaa,Zaa,Taa + Haa,Taa + Hhaa,Ttaa + Hhaa转录......)应该被某些东西取代,或者Dhaal和Thaa都应该被多次转录。 / p>

然后,因为它的Qur' anic脚本,所有没有变音符号的Alefs,Hamza,Madda等应该被视为Alef(或Hamzat)ul-Wasl,并且在索引时也应该考虑/搜索,因为Waqf / Wasl在阅读阿拉伯语。 (例如考虑在Surat Al-Alaq的第一个Aayah中的所有Wasl`s)

Dunno,如果这是以任何方式回答您的问题,但我希望它在实施您的应用程序方面提供一些帮助。