нечеткое совпадение 2 слов - PullRequest
0 голосов
/ 09 апреля 2020

Это:

 {
      ""query"": {
        ""match"": {
          ""attachment.content"": {
              ""query"": ""hello world"",
              ""minimum_should_match"": 2,
              ""fuzziness"": 1
          }
        }
      }
    }

предназначено для возврата элементов, которые содержат:

hello world
hello Vorld
pello world

Другими словами, где макс. один персонаж отличается. Также возможно возвращать только те элементы, которые содержат:

hello

. Почему это происходит в свете указания минимума_символа = 2, т. Е. Наложения AND?

PS:

Часть соответствующее отображение:

{
  "my_great_index" : {
    "mappings" : {
      "properties" : {
        "attachment" : {
          "properties" : {
            "author" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "containsMetadata" : {
              "type" : "boolean"
            },
            "content" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "content_length" : {
              "type" : "long"
            },
            "content_type" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "date" : {
              "type" : "date"
            },
            "detect_language" : {
              "type" : "boolean"
            },
            "indexed_chars" : {
              "type" : "long"
            },
            "keywords" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "language" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "title" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "something_else" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
        ....

PPS:

Вот как я создаю индекс в C#:

https://www.elastic.co/blog/the-future-of-attachments-for-elasticsearch-and-dotnet

public static void CreateIndex(ElasticClient client, string indexName)
{
    var createIndexResponse = client.Indices.Create(indexName, c => c
    .Settings(s => s
        .Analysis(a => a
        .Analyzers(ad => ad
            .Custom("windows_path_hierarchy_analyzer", ca => ca
            .Tokenizer("windows_path_hierarchy_tokenizer")
            )
        )
        .Tokenizers(t => t
            .PathHierarchy("windows_path_hierarchy_tokenizer", ph => ph
            .Delimiter('\\')
            )
        )
        )
    )
    .Map<MyItem>(mp => mp
        .AutoMap()
        .Properties(ps => ps
        .Text(s => s
            .Name(n => n.Id)
            .Analyzer("windows_path_hierarchy_analyzer")
        )
        .Object<Attachment>(a => a
            .Name(n => n.Attachment)
            .AutoMap()
        )
        )
    )
    );

    var putPipelineResponse = client.Ingest.PutPipeline("attachments", p => p
    .Description("Document attachment pipeline")
    .Processors(pr => pr
        .Attachment<MyItem>(a => a
        .Field(f => f.Content)
        .TargetField(f => f.Attachment)
        )
        .Remove<MyItem>(r => r
        .Field(ff => ff
            .Field(f => f.Content)
        )
        )
    )
    );
}

1 Ответ

0 голосов
/ 09 апреля 2020

Я только что попробовал ваш пример на elasti c -поиск версии 7.6, и он работал для меня Можете ли вы указать, как вы индексировали свои данные ie образец документации и версию вашего эластичного поиска?

Также указанный вами запрос не является синтаксически правильным.

Индексное определение с помощью меньше полей

{
    "mappings": {
        "properties": {
            "attachment": {
                "properties": {
                    "author": {
                        "type": "text"
                    },
                    "content": {
                        "type": "text"
                    }
                }
            }
        }
    }
}

проиндексировано 3 ожидаемых вами документа

{
    "attachment.author": "bar",
    "attachment.content": "pello world"
}

{
    "attachment.author": "bar",
    "attachment.content": "hello world"
}

{
    "attachment.author": "bar",
    "attachment.content": "hello vorld"
}

Тот же поисковый запрос, который вы указали с правильным синтаксисом

{
    "query": {
        "match" : {
            "attachment.content" : {
                "query" : "hello world", --> properly closed quotes
                "minimum_should_match": 2,
                "fuzziness": 1
            }
        }
    }
}

Результаты поиска

 "hits": [
            {
                "_index": "fuzzy",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.9400072,
                "_source": {
                    "attachment.author": "foo",
                    "attachment.content": "hello world"
                }
            },
            {
                "_index": "fuzzy",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.8460065,
                "_source": {
                    "attachment.author": "bar",
                    "attachment.content": "hello vorld"
                }
            },
            {
                "_index": "fuzzy",
                "_type": "_doc",
                "_id": "3",
                "_score": 0.8460065,
                "_source": {
                    "attachment.author": "bar",
                    "attachment.content": "pello world"
                }
            }
        ]

Есть еще одна часть вашего вопроса, а именно документы, содержащие только hello, поступающие в результаты поиска, хотя minimum_should_match=2, который также работает нормально, я проиндексировал еще одну операцию c as

{
    "attachment.author": "bar",
    "attachment.content": "my world" --> only world
}

Снова тот же поисковый запрос возвращает только предыдущие 3 документа, но если мы изменим minimum_should_match на 1, он вернет все 4 документа.

{
                "_index": "fuzzy",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0498221,
                "_source": {
                    "attachment.author": "foo",
                    "attachment.content": "hello world"
                }
            },
            {
                "_index": "fuzzy",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.9784871,
                "_source": {
                    "attachment.author": "bar",
                    "attachment.content": "hello vorld"
                }
            },
            {
                "_index": "fuzzy",
                "_type": "_doc",
                "_id": "3",
                "_score": 0.91119266,
                "_source": {
                    "attachment.author": "bar",
                    "attachment.content": "pello world"
                }
            },
            {
                "_index": "fuzzy",
                "_type": "_doc",
                "_id": "4",
                "_score": 0.35667494,
                "_source": {
                    "attachment.author": "bar",
                    "attachment.content": "my world" --> note last 4 doc
                }
            }
        ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...