Finding snippet location in text array

I'm trying to use App Search to build a document search feature. I am storing the text of documents I want to search in an array, where each element is a string consisting of all the text of a single page. My current schema is as follows:

{​

    "title": "Alice in Wonderland",​
    "url": "alice_in_wonderland.pdf",​
    "text": ["text of page 1...",​
        "text of page 2...",...​
        "text of page 545.."]​

}​

App search returns results with the snippet of where the query phrase is found. However, the result doesn't return the page number of where it is found (i.e, which element of the text array). Is there a way to make this happen in App Search? Or do I have to move to regular ElasticSearch.

Since App Search doesn't support nested fields, you'd need to flatten your data structure, so something like this:

{​
    "title": "Alice in Wonderland",​
    "url": "alice_in_wonderland.pdf",​
    "page": 1,
    "text": "text of page 1"
}​,
{​
    "title": "Alice in Wonderland",​
    "url": "alice_in_wonderland.pdf",​
    "page": 2,
    "text": "text of page 2"
}​

Etc.

Depending on how you want to show your search results you could then, "group" on the "title" field: https://www.elastic.co/guide/en/app-search/current/grouping.html.

That solution works for me!

Another thing that I'm wondering about is how I can modify config in react-search-ui to set group on the title field.

@coding_martian Search UI doesn't have first class support for grouping, but you can add grouping to your searches using the beforeSearchCall hook. See the example here: https://github.com/elastic/search-ui/blob/master/ADVANCED.md#api-config.

Please note that "tip" at the top of this page: https://www.elastic.co/guide/en/app-search/current/grouping.html.

A few things to remember when using Grouping: 1. Grouping does not support Curations. 2. Facets only show total results and not total number of groups. 3. Sorting and Paging require the experimental collapse flag to be set to true .

You'll probably want paging and sorting to work so you should use the 'collapse' flag:

"group": { 
  "field": "title",
  "collapse": true
}

The field you are grouping on must not have multiple values. Multiple values will cause an error.

If you're using collapse, you MUST make sure that you do not have multiple values for title in any of your fields. So make sure you don't have data that look like this:

{​
    "title": ["Alice in Wonderland",​ "Alice Returns to Wonderland"]
}

One last note, since Search UI won't know what to do with the grouped results, you'll need to create a custom Result view: Reference UI - how to modify what's displayed (React newbie). You'll find the "grouped" results in the "_group" field of each record. There is an example response here: https://www.elastic.co/guide/en/app-search/current/grouping.html.

Hopefully that doesn't sound too intimidating, we actually do this exact same thing on https://www.elastic.co/search.