Search System Specification - NFSandbox/sh_trade_backend GitHub Wiki

Search Item

  • Item Name
  • Item Description

Search Tags

  • Union Several Tags

Search User

  • Tag-Centered Searching

Result consists of two part:

  • Item metadata related result
  • Tag related result.
    • Ranked by satisfied tags count

Search Result Basics

The search result should contains several part:

  • Item Search result using Item Name Search.
  • Item Search result using Tag List Search.
  • Tag Search result.

Search By Item Name

To be simple, we could directly use name LIKE %{search_name}% to select items.

Search By Tag List

Consider user provided a list of tag string:

[tag1, tag2, tag3, ...]

The ranking criteria could be the number of tags a certain item have that is included in the tag list.

Implementation

We could select Tag entity with Item entity joined, grouped by Item.item_id. This means the count of one group is exactly how many tags of an item has matched the tag list. (In case that Item.tag not duplicated)

Then we can order the select result by the group count.

Search Filter

We should consider support Search Filter format in keyword at backend-level.

Query Format For Filter

The basic format of filter should be:

<filter_keyword>:[<filter_value>]

The filter_keyword is compulsory while filter_value part could be left empty.

There could be several filters in one search string query, and all filters would be first converted into a filter info dictionary.

The String-To-Dict conversion should be implemented in backend, which ensures we don’t need to rewrite the conversion logic across different frontend programs.


Below is an example of such format:

Test Item recent:14 processing: tag:a tag:b

Should be first converted into:

filter_dict = {
    recent: 14,
    processing: true,
    tag:[a, b]
}

Available Filters

recent:<number>

recent filter is used to limited the published time of the item in search result. The <number> value is used to specify the limit time period in day unit.

E.g.: recent:7 will limit the items is published in recent 7 days.

tag:<tag_name> [...]

tag filter is used to specify the tags an item must have to appeared in the search result. Items does not contain the specified tags will be filtered out of the search result.

Note that you can add several tag filters in a single search query, in this case all tags specified should be required on an item (connected with AND criteria when perform database queries).

E.g.: chairs tag:wood tag:ikea will return items with keyword chairs in name and with both wood and ikea tags.

  • Item:Nice chairs tags=[wood, new]
  • Item:Ordinary chairs tags=[wood, ikea]
  • Item:Ordinary chairs tags=[wood, ikea, new]
  • Item:chair tags=[]

Implementation Details

All functionalities of filters should finally be able to interpreted as a WHERE criteria of a SQL Statement. The process detail is as follows:

IMG_2251

As the image shows, we should also promise the WHERE criteria produced by filters does not interfere with the one generated by by-name and by-tag searches which will cause incorrect result.

⚠️ **GitHub.com Fallback** ⚠️