<div align="JUSTIFY" dir="rtl">
<p align="center" dir="rtl">بسم الله الرحمن الرحیم</p>

<p align="center">
  <img src="img/index.png" />
</p>

# فیلتر رمز مترادف

فیلتر نشانه مترادف اجازه می دهد تا به راحتی مترادف ها را در طول فرآیند تجزیه و تحلیل مدیریت کنید. مترادف ها با استفاده از یک فایل پیکربندی پیکربندی می شوند.

## به عنوان مثال:

<div align="left" dir="ltr" style="background-color:black;">

```json

PUT /test_index
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "whitespace",
            "filter": [ "synonym" ]
          }
        },
        "filter": {
          "synonym": {
            "type": "synonym",
            "synonyms_path": "analysis/synonym.txt"
          }
        }
      }
    }
  }
}

```

</div>

مورد بالا یک فیلتر مترادف را با یک مسیر analysis/synonym.txt (که بایستی در مسیر پیکربندی elasticsearch قرار گیرد یعنی:/etc/elasticsearch/) پیکربندی می کند.
سپس تحلیلگر مترادف با فیلتر پیکربندی می شود.

نکته:
الاستیک سرچ به طور پیش فرض شاخه ی کانفیگ خود را می شناسد، پس نمی توان شاخه دلخواه خود را اعمال کرد.

این فیلتر مترادف‌هایی را با هر توکنایزر و فیلترهای نشانه‌ای که قبل از آن در زنجیره ظاهر می‌شوند، تبدیل می‌کند.

تنظیمات اضافی عبارتند از:

-   expand (defaults to true).
-   lenient (defaults to false)

lenient اگر true باشد هنگام تجزیه پیکربندی مترادف، استثناها را نادیده می گیرد. توجه به این نکته مهم است که فقط آن دسته از قوانین مترادف که نمی توانند تجزیه شوند نادیده گرفته می شوند. به عنوان مثال درخواست زیر را در نظر بگیرید:

<div align="left" dir="ltr" style="background-color:black;">

```json


PUT /test_index
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "standard",
            "filter": [ "my_stop", "synonym" ]
          }
        },
        "filter": {
          "my_stop": {
            "type": "stop",
            "stopwords": [ "bar" ]
          },
          "synonym": {
            "type": "synonym",
            "lenient": true,
            "synonyms": [ "foo, bar => baz" ]
          }
        }
      }
    }
  }
}

```

</div>

با درخواست بالا، کلمه bar حذف می شود، اما یک مپینگ(mapping) foo => baz همچنان اضافه می شود.

با این حال، اگر mapping که اضافه می‌شود foo بود، baz => bar هیچ چیز به لیست مترادف اضافه نمی‌شد.

این به این دلیل است که کلمه هدف برای mapping به خودی خود حذف می شود زیرا یک کلمه stop word بود.

به طور مشابه، اگر نگاشت "bar، foo، baz" بود و Expand روی false تنظیم می شد، هیچ نگاشت اضافه نمی شد، همانطور که وقتی expand=false نگاشت هدف اولین کلمه است.

با این حال، اگر expand=true باشد، نگاشت های اضافه شده معادل foo، baz => foo، baz یعنی همه نگاشت ها به غیر از کلمه stop word خواهد بود.

## tokenizer و ignore_case منسوخ شده اند:

پارامتر tokenizer، tokenizer را که برای توکن کردن مترادف استفاده می شود کنترل می کند، این پارامتر برای سازگاری با شاخص هایی است که قبل از 6.0 ایجاد شده اند.

پارامتر ignore_case فقط با پارامتر tokenizer کار می کند.

دو فرمت مترادف پشتیبانی می شوند: Solr، WordNet.

## مترادف Solr(Solr synonyms):

فرمت زیر نمونه ای از فایل است:

<div align="left" dir="ltr" style="background-color:black;">

```bash

# Blank lines and lines starting with pound are comments.

# Explicit mappings match any token sequence on the LHS of "=>"

# and replace with all alternatives on the RHS. These types of mappings

# ignore the expand parameter in the schema.

# Examples:

i-pod, i pod => ipod
sea biscuit, sea biscit => seabiscuit

# Equivalent synonyms may be separated with commas and give

# no explicit mapping. In this case the mapping behavior will

# be taken from the expand parameter in the schema. This allows

# the same synonym file to be used in different synonym handling strategies.

# Examples:

ipod, i-pod, i pod
foozball , foosball
universe , cosmos
lol, laughing out loud

# If expand==true, "ipod, i-pod, i pod" is equivalent

# to the explicit mapping:

ipod, i-pod, i pod => ipod, i-pod, i pod

# If expand==false, "ipod, i-pod, i pod" is equivalent

# to the explicit mapping:

ipod, i-pod, i pod => ipod

# Multiple synonym mapping entries are merged.

foo => foo bar
foo => baz

# is equivalent to

foo => foo bar, baz

```

</div>

همچنین می‌توانید مترادف‌هایی را برای فیلتر مستقیماً در فایل پیکربندی تعریف کنید (به استفاده از مترادف‌ها به جای synonyms_path توجه کنید):

<div align="left" dir="ltr" style="background-color:black;">

```json

PUT /test_index
{
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "synonym": {
            "type": "synonym",
            "synonyms": [
              "i-pod, i pod => ipod",
              "universe, cosmos"
            ]
          }
        }
      }
    }
  }
}

```

</div>

با این حال، توصیه می شود مترادف های بزرگ را در یک فایل با استفاده از synonyms_path تعریف کنید، زیرا تعیین آنها به صورت درون خطی باعث افزایش بی مورد اندازه خوشه می شود.

مترادف های WordNet (WordNet synonyms):

مترادف های مبتنی بر قالب WordNet را می توان با استفاده از فرمت اعلام کرد:

<div align="left" dir="ltr" style="background-color:black;">

```json

PUT /test_index
{
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "synonym": {
            "type": "synonym",
            "format": "wordnet",
            "synonyms": [
              "s(100000001,1,'abstain',v,1,0).",
              "s(100000001,2,'refrain',v,1,0).",
              "s(100000001,3,'desist',v,1,0)."
            ]
          }
        }
      }
    }
  }
}

```

</div>

استفاده از synonyms_path برای تعریف مترادف های WordNet در یک فایل نیز پشتیبانی می شود.

## تجزیه فایل های مترادف:

Parsing synonym files:

Elasticsearch از فیلترهای توکن قبل از فیلتر مترادف در یک زنجیره نشانه ساز برای تجزیه ورودی های یک فایل مترادف استفاده می کند. بنابراین، به عنوان مثال، اگر یک فیلتر مترادف بعد از یک استمر قرار داده شود، آنگاه استمر به ورودی های مترادف نیز اعمال می شود. از آنجا که ورودی‌های نقشه مترادف نمی‌توانند موقعیت‌های انباشته داشته باشند، برخی از فیلترهای نشانه ممکن است در اینجا مشکلاتی ایجاد کنند. فیلترهای رمزی که چندین نسخه از یک نشانه را تولید می‌کنند، ممکن است انتخاب کنند که کدام نسخه از نشانه را هنگام تجزیه مترادف‌ها منتشر کند، به عنوان مثال asciifolding فقط نسخه تاشده رمز را تولید می‌کند. دیگران، به عنوان مثال مالتی پلکسر، word_delimiter_graph یا ngram یک خطا ایجاد می کنند.

اگر نیاز به ساخت آنالایزرهایی دارید که هم فیلترهای چند نشانه ای و هم فیلترهای مترادف را شامل می شوند، از فیلتر مالتی پلکسر استفاده کنید که فیلترهای چند نشانه ای در یک شاخه و فیلتر مترادف در شاخه دیگر قرار دارند.

## مثال تحریر:

فایلهای زیر را در شاخه الاستیک سرچ یعنی(/etc/elasticsearch) کپی کنید:
<br>
[syn_all.txt](files/syn_all.txt)
<br>
[syn_halfspace.txt](files/syn_halfspace.txt)

کدهای زیر را در محیط Dev Tools کیبانا اجرا کنید:

<div align="left" dir="ltr" style="background-color:black;">

```json
DELETE test_index

POST test_index/_search
{
  "query": {
    "match": {
      "content.fa": "پخته"
    }
  },
  "highlight": {
    "fields": {"content.fa": {}}
  }
}

POST test_index/_doc
{
    "title": "بازی کردن",
    "content": "آب دیده روان شد"

}


PUT /test_index
{
  "mappings": {
    "date_detection": false,
    "properties": {
      "title": {
        "type": "text",
        "fields": {
          "fa": {
            "type": "text",
            "analyzer": "normal_analyzer_persian",
            "search_analyzer": "normal_analyzer_persian",
            "search_quote_analyzer": "normal_analyzer_persian"
          }
        }
      },
      "content": {
        "type": "text",
        "fields": {
          "fa": {
            "type": "text",
            "analyzer": "normal_analyzer_persian",
            "search_analyzer": "normal_analyzer_persian",
            "search_quote_analyzer": "normal_analyzer_persian"
          }
        }
      }
    }
  },
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "normal_analyzer_persian": {
            "type": "custom",
            "tokenizer": "standard",
            "char_filter": [],
            "filter": [
              "fa_halfspace",
              "fa_synonym"
            ]
          }
        },
        "filter": {
          "fa_halfspace": {
            "type": "synonym",
            "lenient": true,
            "synonyms_path": "../../home/gateway/common/syn_halfspace.txt"
          },
          "fa_synonym": {
            "type": "synonym",
            "lenient": true,
            "synonyms_path": "../../home/gateway/common/syn_all.txt"
          }
        }
      }
    }
  }
}

```

</div>

[منبع](https://www.elastic.co/guide/en/elasticsearch/reference/7.17/analysis-synonym-tokenfilter.html#_solr_synonyms)

<p align="center" dir="rtl">صلوات</p>
</div>
